Python 父类检查子类中要在类函数中使用的属性

标签 python class object inheritance

我正在编写这个 Python(2.7) 脚本,它是一系列菜单。对于每个子菜单,都有一个继承 BaseMenu 的子类。有一个名为 SubMenu 的子类,我想在子菜单名称的标题下方打印 server_name 。在 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
    )

最佳答案

您可以为您创建一个设置此属性的BaseMenu构造函数,或者使用hasattr()

关于Python 父类检查子类中要在类函数中使用的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17384804/

相关文章:

python - 在 matplotlib 中使用 savefig() 时的 unicode 文本

java - 使用 ANT 从 jar 库加载 java premain-class

javascript - 如何将对象从另一个文件实例化到另一个文件 - javascript

python - numpy 数组上的可分离过滤器

python - 如何使用 Python 将表格从 CSV 写入 PDF

class - 使用类引用进行多态和继承(第2部分)?

ios - Swift Objective-C 运行时类命名

java - 静态引用和使用在主程序之外初始化的对象?

javascript - 数组对象区别javascript angularjs

python - 使用破折号下拉列表过滤 pd.DataFrame