Python 动态公开对象属性
我不想失去对Python 动态公开对象属性,python,Python,我不想失去对Qux本身定义的任何属性的访问权,而是要公开Foo上定义的属性,如果它们不在Qux上,则定义一个: 每当有人试图查找对象的属性,但通过正常方式失败时,就会调用\uuuu getattr\uuuu 它有一个邪恶的孪生兄弟,叫做\uuuu getattribute\uuuu,它总是被调用,必须非常小心地使用。定义一个: 每当有人试图查找对象的属性,但通过正常方式失败时,就会调用\uuuu getattr\uuuu 它有一个邪恶的孪生兄弟,名为\uuuu getattribute\uuuu
Qux
本身定义的任何属性的访问权,而是要公开Foo
上定义的属性,如果它们不在Qux
上,则定义一个:
每当有人试图查找对象的属性,但通过正常方式失败时,就会调用\uuuu getattr\uuuu
它有一个邪恶的孪生兄弟,叫做\uuuu getattribute\uuuu
,它总是被调用,必须非常小心地使用。定义一个:
每当有人试图查找对象的属性,但通过正常方式失败时,就会调用\uuuu getattr\uuuu
它有一个邪恶的孪生兄弟,名为\uuuu getattribute\uuuu
,它总是被调用,必须非常小心地使用。您可以通过定义而不是使用属性来实现这一点。对于标准协议中找不到的任何属性,Python将调用类的\uuu getattr\uuu
方法
此外,要存储项
,必须将其分配给self.item
,否则将在Qux的末尾抛出
最后,在这种情况下,从Foo
继承似乎是不必要的
class Qux(Foo):
def __init__(self):
self.item = Foo()
def __getattr__(self, attr):
return getattr(self.item, attr)
例子
遗产
尽管如此,您似乎有一半试图通过继承来实现这一点。如果您的意图是通过Foo
扩展Qux
行为,那么继承将是一条出路
f = Foo('strenght')
q = Qux(f)
print(q.superpower) # 'strenght'
例子
您可以通过定义而不是使用属性来实现这一点。对于标准协议中找不到的任何属性,Python将调用类的\uuu getattr\uuu
方法
此外,要存储项
,必须将其分配给self.item
,否则将在Qux的末尾抛出
最后,在这种情况下,从Foo
继承似乎是不必要的
class Qux(Foo):
def __init__(self):
self.item = Foo()
def __getattr__(self, attr):
return getattr(self.item, attr)
例子
遗产
尽管如此,您似乎有一半试图通过继承来实现这一点。如果您的意图是通过Foo
扩展Qux
行为,那么继承将是一条出路
f = Foo('strenght')
q = Qux(f)
print(q.superpower) # 'strenght'
例子
@Vishal使用\uuuuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。当您知道已经定义了它时,请确保不要直接使用setattr()
,因为这将再次触发\uuuuuuuuuuuuuuuu
方法。相反,调用super()。当您知道已经定义了它时,请确保不要直接使用setattr()
,因为这将再次触发\uuuuuuuuuuuuuuuu
方法。相反,调用super()。\uuuu setattr\uuuu(self,attr,val)
。我选择了另一个,只是因为它首先得到了回答。这两个答案对我都适用。“谢谢你。”维沙:当然可以。很高兴我们能帮忙!我选择了另一个,只是因为它首先得到了回答。这两个答案对我都适用。“谢谢你。”维沙:当然可以。很高兴我们能帮忙!
f = Foo('strenght')
q = Qux(f)
print(q.superpower) # 'strenght'
class Foo:
def __init__(self, superpower):
self.superpower = superpower
class Qux(Foo):
def __getattr__(self, name):
return getattr(self.item, name)
q = Qux('strenght')
print(q.superpower) # 'strenght'