与实例方法同名的Python装饰器

2024-06-02 07:44:40 发布

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

我有一个与this非常相似的问题,只是我想将我的函数命名为property

例如,我喜欢做一些事情,比如:

class ThingWithProperties(object):

    def property(self, a):
        print("in property", a)

    @property
    def test(self):
        print("in test")

t = Testing()
t.property(1)
t.test()

但我得到了以下错误:

^{pr2}$

有人能解释一下为什么会这样吗?以及如何解决它(而不重命名我的实例方法)?在


Tags: 函数intestselfobjectdef错误property
1条回答
网友
1楼 · 发布于 2024-06-02 07:44:40

之所以会发生这种情况,是因为通过定义一个名为property的方法,就可以在类声明的范围内隐藏内置的property。因此,当您编写@property时,您的方法被调用来修饰test,而不是内置的property。在

您可以使用__builtin__模块显式使用内置的property

class ThingWithProperties(object):

    def property(self, a):
        print("in property", a)

    @__builtin__.property
    def test(self):
        print("in test")

尽管我个人总是避免隐藏内部构件,即使它们只是在有限的范围内被隐藏,就像这里的情况一样。在


要更清楚地了解“阴影”的情况,请尝试在您的解释器中运行以下命令:

^{pr2}$

这里有两点需要说明:首先,有些人可能会惊讶于我们可以在类定义中使用print的东西。关键是类定义和其他定义一样是一个代码块,您可以随意编写for-loops和{},并且在实际创建类时,您创建的任何变量或函数都会聚集到一个类字典中。在

第二点是类定义创建了一个新的作用域,并且作用域内的foo的值与外部不同。也就是说,上面的打印42,然后73,然后42。在

相关问题 更多 >