在类中设置python方法的属性

时间:2018-10-12 22:59:39

标签: python

我无法在类内部设置函数的属性。 最小示例:

class Foo:
    def bar(self):
        pass

f = Foo()
f.bar.attribute = True 

对我来说,这将引发一个AttributeError: 'method' object has no attribute 'attribute'setattr(f.bar, 'attribute', True)而不是最后一行会引发相同的错误)。

设置属性的方法比f.bar.__dict__['attribute'] = True更加优雅或实用吗?

2 个答案:

答案 0 :(得分:4)

方法对象没有任何地方可以存储自己的任意属性。同样,在每次访问时都创建方法对象-f.bar is not f.bar-因此,即使您可以在方法对象上设置属性,当您尝试再次查找它时,该属性也不会存在。这意味着您确实不应该尝试在方法对象上设置属性。

当您请求方法对象无法识别的属性时,它会将请求转发到基础函数,因此f.bar.__dict__实际上是Foo.bar.__dict__。在该字典中设置条目将设置基础函数的属性,因此它们将在Foo的每个实例中可见,并且单独实例的方法将没有独立的属性。

无论您想通过在方法对象上设置属性来解决什么问题,都应该找到其他解决方法。

答案 1 :(得分:1)

  

我无法在类内部设置函数的属性。

实际上,您可以。您试图做的是在类的 instance 上设置特定方法的属性。那,你做不到(AFAIK)。

Foo是课程。尝试Foo.bar.attribute = True。这将影响Foo的所有所有实例,而不仅仅是f。例如:

class Foo:
    def bar(self):
        pass

f = Foo()
Foo.bar.attribute = True
print(f.bar.attribute) # outputs True
z = Foo()
print(z.bar.attribute) # Also outputs True

实际上,f.bar.__dict__['attribute'] = True实际上也将其设置为类级别:

class Foo:
    def bar(self):
        pass

f = Foo()
f.bar.__dict__['attribute'] = True
print(f.bar.attribute) # Outputs True                                                                                                                                                                       
z = Foo()
print(z.bar.attribute) # Also Outputs True