2013-06-26 12 views
16

Tôi đang viết một chuỗi các menu văn bản. Với lớp và lớp con bên dưới, nó chạy không có vấn đề gì. Nhưng tôi đang xem xét mã hóa của tôi và tôi tự hỏi .... là nó ok mà tôi đã không sử dụng def __init__(self) trong các lớp học? Tôi có nên đặt các thành viên dữ liệu trong số def __init__(Self): như self.images =(), self.options =() không? Nếu tôi đã làm điều đó thì tôi không thể sử dụng mô-đun abc để kiềm chế, đúng không?Lớp Python mà không sử dụng def __init __ (tự)

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 
     ) 

Trả lời

11

Mã của bạn hoàn toàn ổn. Bạn không để có phương thức __init__.

Bạn vẫn có thể sử dụng __init__, ngay cả với ABC. Tất cả các kiểm tra meta của ABC là nếu các tên đã được xác định. Thiết images trong một __init__ không đòi hỏi bạn phải xác định một thuộc tính lớp, nhưng bạn có thể thiết lập đó để None lúc đầu:

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

Bây giờ bạn có thể thiết lập các ràng buộc trên ABC đòi hỏi rằng một tài sản trừu tượng images có sẵn; thuộc tính lớp images = None sẽ đáp ứng ràng buộc đó.