使用 属性 装饰器在函数内部使用列表理解从命名元组中恢复值?
Values recovery from named tuples using list comprehension inside function with property decorator?
我正在关注 python documentation and also this,但在使用 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>
问题出在您的 __init__
方法中:
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')
Returns a new tuple subclass
named typename
因此,在 __init__
方法的第一行中,您初始化了一个新的 class
并将其分配给字段 self.Keyboard
,并在下一行中创建了一个新的 [=17] =] 的 class self.Keyboard
但是将它分配给任何地方,self.Keyboard
仍然是一个 class 对象。所以下面的代码所做的是 iterating/printing 个 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')
然后你会得到你想要的值。
我正在关注 python documentation and
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>
问题出在您的 __init__
方法中:
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')
Returns a new tuple
subclass
named typename
因此,在 __init__
方法的第一行中,您初始化了一个新的 class
并将其分配给字段 self.Keyboard
,并在下一行中创建了一个新的 [=17] =] 的 class self.Keyboard
但是将它分配给任何地方,self.Keyboard
仍然是一个 class 对象。所以下面的代码所做的是 iterating/printing 个 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')
然后你会得到你想要的值。