2

一連のメニューであるこの Python(2.7) スクリプトを作成しています。サブメニューごとに、BaseMenu を継承する子クラスがあります。サブメニュー名のタイトルの下に server_name を出力したい SubMenu というサブクラスが 1 つあります。BaseMenu() に、属性が存在するかどうかを確認する if ステートメントを配置しようとしました。存在する場合は、それを出力します。

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, '+')
    ###Below is the check
    if self.modify_server_class:
            print self.modify_server_class.center(term, '+')

AttributeError: 'Servers' object has no attribute 'modify_server_class'その属性を持たない他のクラスを実行しようとすると、機能せず、不平を言いました。

BaseClass でこの属性をチェックし、存在する場合は出力するにはどうすればよいですか? すべてのクラスに属性を入れて false に設定したくありません。もっときれいな方法があるようです。

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, '+')
    if self.modify_server_class:
            print self.modify_server_class.center(term, '+')
        print "Please choose which option:"
        for i in self.options:
            print(
                str(self.options.index(i)+1) + ") "
                + i.__name__
            )
        while True:
        value = int(raw_input("Please Choose[ENTER to exit]: ")) - 1

        try:
        if value == "":
            break
        else:
            #with Redirect(self.file_object):
            self.options[value](self)
            self.display()
        except IndexError:
        print "Out of range!"


class ModifyServer(BaseMenu):
    def __init__(self, a):
    self.servers_object = a

    menu_name = "Modify Server"
    server_chosen = "None"
    modify_server_class = "hi"

    def choose_server(self):
    if not self.servers_object.servers:
        cs = pyrax.cloudservers
        self.servers_object.servers = cs.servers.list()
    temp = self.servers_object.servers
    for index, item in enumerate(temp):
        print (
        "%s) %s" % (index+1, item.name)
        )

    def jj(self):
    pass

    options = (
        choose_server,
    jj
    )
4

1 に答える 1

2

BaseMenuこの属性を設定するコンストラクターを作成するか、使用することができますhasattr()

于 2013-06-29T21:25:36.330 に答える