2017-03-19 13 views
-1

저는 python documentationthis SO answerthis입니다. getattr을 사용할 때 속성 객체 포인터를 얻고 있습니다. 메신저에서 값을 가져 오거나 인쇄 할 수 없습니다.속성 장식자를 사용하여 함수 내에서 목록 이해를 사용하여 명명 된 튜플에서 값을 복구합니까?

class DefaultSettings(): 
    """This contains default game settings.""" 
    def __init__(self): 
     """Default settings""" 
     self.Keyboard = namedtuple('Keyboard', ['gas', 'reverse', 'sbreak', 'ebreak', 'left', 'right']) 
     self.Keyboard(gas = 'WKEY', reverse = 'SKEY', sbreak = 'SKEY', ebreak = 'SPACEKEY', left = 'AKEY', right = 'DKEY') 
    @property 
    def keyboard(self): 
     return [getattr(self.Keyboard, key) for key in self.Keyboard._fields] 

settings = DefaultSettings() 
print("keyboard 1: ",settings.keyboard) 
print("Keyboard 2: ",settings.Keyboard) 
print("keyboard 3: ",settings.Keyboard._fields) 
print("Keyboard 4: ", DefaultSettings.keyboard.__get__) 
print("Keyboard 5: ", DefaultSettings.keyboard.__get__(settings, DefaultSettings)) 
for key in settings.Keyboard._fields: 
    print(getattr(settings.Keyboard, key)) 

및 출력 :

D:\Games\BSR\scripts>python config.py 
keyboard 1: [<property object at 0x000001C18DDC4778>, <property object at 0x000001C18DDC4AE8>, <property object at 0x000001C18DDC4B38>, <property object at 0x000001C18DDC4B88>, <property object at 0x000001C18DDC4BD8>, <property object at 0x000001C18DDC4C28>] 
Keyboard 2: <class '__main__.Keyboard'> 
keyboard 3: ('gas', 'reverse', 'sbreak', 'ebreak', 'left', 'right') 
Keyboard 4: <method-wrapper '__get__' of property object at 0x000001C18DDC4598> 
Keyboard 5: [<property object at 0x000001C18DDC4778>, <property object at 0x000001C18DDC4AE8>, <property object at 0x000001C18DDC4B38>, <property object at 0x000001C18DDC4B88>, <property object at 0x000001C18DDC4BD8>, <property object at 0x000001C18DDC4C28>] 
<property object at 0x000001C18DDC4778> 
<property object at 0x000001C18DDC4AE8> 
<property object at 0x000001C18DDC4B38> 
<property object at 0x000001C18DDC4B88> 
<property object at 0x000001C18DDC4BD8> 
<property object at 0x000001C18DDC4C28> 
D:\Games\BSR\scripts> 
+1

'self.Keyboard'는 여전히 클래스이며 인스턴스가 아닙니다. 인스턴스를 만들 때 아무 것도 지정하지 않습니다. 왜 그 클래스를 init 메소드 밖에서 만들고, 심지어 DefaultSettings 외부에서 만들지 않겠습니까? – jonrsharpe

+0

나는 방금 그렇게했고 출력은 같습니다. – Strapicarus

+1

왜'return list (self.Keyboard)'를 쓰지 않으시겠습니까? 이름은 제쳐두고, 여전히 기본적으로 값의 튜플입니다. – jonrsharpe

답변

1

문제는 당신 __init__ 방법입니다 : the doc of namedtuple으로

def __init__(self): 
    """Default settings""" 
    self.Keyboard = namedtuple('Keyboard', ['gas', 'reverse', 'sbreak', 'ebreak', 'left', 'right']) 
    self.Keyboard(gas = 'WKEY', reverse = 'SKEY', sbreak = 'SKEY', ebreak = 'SPACEKEY', left = 'AKEY', right = 'DKEY') 

는 말한다 :

새로운 튜플 subclass라는 이름의 타이를 돌려줍니다

그래서 __init__ 방법의 첫 번째 줄에, 새 class init을하고 필드 self.Keyboard 그것을 assgin, 다음 줄에 당신이 클래스 self.Keyboard의 새로운 instance을 만들 pename하지만이 곳의 self.Keyboard가 없습니다에 할당 여전히 클래스 객체. 그래서 다음 코드가 수행하는 것은 인스턴스가 아닌 class의 속성과 메서드를 반복/인쇄하는 것입니다.
def __init__(self): 
    Keyboard = namedtuple('Keyboard', ['gas', 'reverse', 'sbreak', 'ebreak', 'left', 'right']) 
    self.Keyboard = Keyboard(gas = 'WKEY', reverse = 'SKEY', sbreak = 'SKEY', ebreak = 'SPACEKEY', left = 'AKEY', right = 'DKEY') 

그런 다음 원하는 값을 얻을 것이다 : 나는 당신이있을 수 있습니다 원하는 것 같아요.