我可以创建以下格式的函数。
def bar():
if not hasattr(bar, 'c'):
bar.c = 0
bar.c += 1
return bar.c
运行时,它会按预期产生以下输出:
>>> bar()
1
>>> bar()
2
>>> bar()
3
但是如果我突然将这个函数移到一个类中,Python 会报错。
class Foo(object):
def bar(self):
if not hasattr(self.bar, 'c'):
self.bar.c = 0
self.bar.c += 1
return self.bar.c
现在我明白了
>>> foo = Foo()
>>> foo.bar()
...
AttributeError: 'method' object has no attribute 'c'
它告诉我它没有属性,但我正在尝试创建属性。这是怎么回事?
最佳答案
摘自 python 文档 (https://docs.python.org/2/library/stdtypes.html?highlight=instancemethod) “但是,由于方法属性实际上存储在底层函数对象 (meth.im_func) 上,因此不允许在绑定(bind)或未绑定(bind)方法上设置方法属性。”
换句话说,我们可以尝试 Foo.bar.im_func.c = 0
,但不幸的是,它是只读的,所以它不起作用。
因此,对于您尝试完成的事情,我建议
class Foo(object):
c = 0
def bar(self):
Foo.c += 1
return Foo.c
f = Foo()
print f.bar()
print f.bar()
print f.bar()
适用于 python2 和 python3。
唯一的“缺点”是 c
可用于类 Foo
的任何其他方法。
关于python - 在类中创建方法属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966248/