python - 在类中创建方法属性

标签 python

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

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/

相关文章:

python - 在 matplotlib 中绘制 3D 凸封闭区域

Python:BeautifulSoup - 从类的名称中获取属性值

python - 如何综合查看两个不同的 DataFrame

python - 在没有特定数字的范围内生成随机数

Python:以逗号作为小数点分隔符加载数据

python - Neo4J 的简单教程并将其与 django + python 一起使用

python - Python MySQLdb 的 CA SSL 参数不起作用,但 key 可以吗?

python - curses.wrapper() 在背景/前景序列之后弄乱终端

Python - 发送数据包发出错误 - Minecraft Packets

python - 如何将两个字段的总和与 Django 中同一模型上的另一个字段进行比较