2013-06-29 2 views
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 
    ) 

답변

2

당신은 내가 노력 hasattr()

+0

이 속성을 설정하면 BaseMenu의 생성자를 만들거나 사용할 수 있습니다 경우으로 hasattr (자기, self.cached_server)하지만 다른 클래스는이 속성이 없을 때 파이썬은 여전히 ​​불평 ... 예제 : AttributeError : 'Servers'객체에 'cached_server'속성이 없습니다. – dman

+1

@dman 속성 이름은 문자열로 주어져야합니다 :'hasattr (self, "cached_server")' –

관련 문제