2
나는 일련의 메뉴 인이 Python (2.7) 스크립트를 작성 중이다. 각 하위 메뉴에는 BaseMenu를 상속하는 하위 클래스가 있습니다. 하위 메뉴 이름의 제목 아래에 server_name을 인쇄하려는 SubMenu라는 하나의 하위 클래스가 있습니다. BaseMenu()에서 나는 속성이있는 경우 문을 확인하는 경우를 넣어 시도하고, 그래서 다음을 인쇄하는 경우 : 나는 다른 클래스를 실행하려고 할 때파이썬 상위 클래스 클래스 속성에서 서브 클래스의 속성 검사
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 (자기, self.cached_server)하지만 다른 클래스는이 속성이 없을 때 파이썬은 여전히 불평 ... 예제 : AttributeError : 'Servers'객체에 'cached_server'속성이 없습니다. – dman@dman 속성 이름은 문자열로 주어져야합니다 :'hasattr (self, "cached_server")' –