2013-06-26 16 views
16

Sto scrivendo una serie di menu di testo. Con la classe e la sottoclasse qui sotto funziona senza problemi. Ma sto rivedendo la mia codifica e mi sto chiedendo .... è ok che non ho usato def __init__(self) nelle classi? Devo aver inserito i dati membri in def __init__(Self): come self.images =(), self.options =()? Se lo facessi, non potrei usare il modulo abc per i restringi, giusto?Classi Python senza utilizzare def __init __ (self)

class BaseMenu(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractproperty 
    def options(self): 
     pass 

    @abc.abstractproperty 
    def menu_name(self): 
     pass 

    def display(self): 
     header = "FooBar YO" 
     term = getTerminalSize() 
     #sys.stdout.write("\x1b[2J\x1b[H") 
     print header.center(term, '*') 
     print self.menu_name.center(term, '+') 
     print "Please choose which option:" 
     for i in self.options: 
      print(
       str(self.options.index(i)+1) + ") " 
       + i.__name__ 
      ) 
     value = int(raw_input("Please Choose: ")) - 1 

     self.options[value](self) 

class Servers(BaseMenu): 

    menu_name = "Servers" 
    images =() 
    foo =() 

    def get_images(self): 
     if not self.images: 
      self.images = list_images.get_images() 
     for img in self.images: 
      print (
       str(self.images.index(img)+1) + ") " 
       + "Name: %s\n ID: %s" % 
       (img.name, img.id) 
       ) 

    def get_foo(self): 
     if not self.foo: 
      self.foo = list_list.get_list() 
     for list in self.foo: 
      print "Name:", list.name 
      print " ID:", list.id 
      print 

    def create_servers(self): 
     create_server.create(self) 

    options = (
     get_images, 
     get_foo, 
     create_servers 
     ) 

risposta

11

Il tuo codice è perfettamente a posto. Non è avere per avere un metodo __init__.

È ancora possibile utilizzare __init__, anche con un ABC. Tutto ciò per cui la meta test ABC è se i nomi sono stati definiti. Impostazione images in un __init__ fa richiede che si definisce un attributo di classe, ma è possibile impostare che a None in un primo momento:

class Servers(BaseMenu): 

    menu_name = "Servers" 
    images = None 
    foo = None 

    def __init__(self): 
     self.images = list_images.get_images() 
     self.foo = list_list.get_list() 

Ora è possibile impostare vincoli sulla ABC che richiedono che una proprietà astratta images essere disponibile; l'attributo della classe images = None soddisferà tale vincolo.

Problemi correlati