Python父类检查子类中要在类函数中使用的属性
我正在编写这个Python(2.7)脚本,它是一系列菜单。对于每个子菜单,都有一个子类继承BaseMenu。有一个子类叫做SubMenu,我想在子菜单名称的标题下打印服务器名称。在BaseMenu()中,我尝试使用if语句检查属性是否存在,如果存在,则打印它:Python父类检查子类中要在类函数中使用的属性,python,class,object,inheritance,Python,Class,Object,Inheritance,我正在编写这个Python(2.7)脚本,它是一系列菜单。对于每个子菜单,都有一个子类继承BaseMenu。有一个子类叫做SubMenu,我想在子菜单名称的标题下打印服务器名称。在BaseMenu()中,我尝试使用if语句检查属性是否存在,如果存在,则打印它: def display(self): header = "FooBar YO" term = getTerminalSize() #sys.stdout.write("\x1b[2J\x1b
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”对象没有属性“modify\u server\u class”
当我尝试运行其他没有该属性的类时
我应该如何让基类检查这个属性并打印它(如果它存在)?我不想把属性放在每个类中并设置为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()
我尝试过的hasattr(self,self.cached\u server)但是,当其他类没有此属性时,Python仍在抱怨……例如:AttributeError:“Servers”对象没有属性“cached\u server”@dman属性名称必须以字符串形式给出:hasattr(self,“cached\u server”)