39

私は一連のテキストメニューを書いています。以下のクラスとサブクラスでは問題なく動作します。しかし、私は自分のコーディングを見直していて、疑問に思っています....def __init__(self)クラスで使用しなくても大丈夫ですか? データ メンバはdef __init__(Self):、self.images = ()、self.options =() などに配置する必要がありますか? 私がそれをしたら、abcモジュールを拘束に使用できませんでしたよね?

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

2 に答える 2

29

あなたのコードは完全に問題ありません。メソッドを持つ必要はありません。__init__

__init__ABCであっても、引き続き使用できます。ABC メタがテストするのは、名前が定義されているかどうかだけです。do で設定imagesするに__init__は、class 属性を定義する必要がありますが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これで、抽象プロパティが使用可能であることを要求する ABC に制約を設定できます。class 属性はimages = Noneその制約を満たします。

于 2013-06-26T22:14:17.493 に答える