2013-06-26 54 views
16

我在写一系列文本菜单。随着下面的类和子类,它运行没有问题。但我正在检查我的编码,我想知道....是不是在课堂上使用def __init__(self)?我是否应该将数据成员放在def __init__(Self):中,比如self.images =(),self.options =()?如果我这样做,那么我无法使用abc模块进行抑制,对吗?Python类没有使用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 
     ) 

回答

11

您的代码非常好。你不要有一个__init__方法。

即使带有ABC,您仍然可以使用__init__。 ABC meta测试的所有内容都是如果名称已被定义。在__init__不设置images需要你定义一个类属性,但你可以在第一次设置,为None

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() 

现在,您可以设置需要一个images抽象属性可在美国广播公司的限制;类属性images = None将满足该约束。

相关问题