Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态公开对象属性_Python - Fatal编程技术网

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'