在类中创建方法属性

2024-06-17 08:52:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以创建以下格式的函数。在

def bar():
    if not hasattr(bar, 'c'):
        bar.c = 0
    bar.c += 1
    return bar.c

运行时,它会按预期产生以下输出:

^{pr2}$

但是如果我突然把这个函数移到一个类中,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'

它告诉我它没有属性,但我正在尝试创建属性。这是怎么回事?在


Tags: 函数selfreturnif属性objectfoodef
1条回答
网友
1楼 · 发布于 2024-06-17 08:52:21

但是,由于方法属性实际上存储在底层函数对象上,所以从python文档(https://docs.python.org/2/library/stdtypes.html?highlight=instancemethod)中获取(方法),不允许在绑定或未绑定方法上设置方法属性。“

换句话说,我们本可以尝试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类的任何其他方法。在

相关问题 更多 >