我无法在类内部设置函数的属性。 最小示例:
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
更加优雅或实用吗?
答案 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