【问题标题】:Using 'property' as the name of a method in a python class在 python 类中使用“属性”作为方法的名称
【发布时间】:2012-02-29 16:07:29
【问题描述】:

这在 Python 中可行吗?

class MyClass(object):
    @property
    def property(self):
        return self._property

也就是说,我想要一个名为“property”的属性。它实际上运行良好,但 Eclipse 抱怨警告。我认为内置的 @property 装饰器与我的类中的方法和属性位于不同的命名空间中。

是否可以在相关模块的范围内重命名内置装饰器,这样我就可以使用名称“property”而不会收到此警告?可能类似于以下内容:

attr = property

class MyClass(object):
    @attr
    def property(self):
        return self._property

我这样做了,但我仍然收到警告,因为我为全局内置 @property 装饰器创建了一个别名,但名称“property”仍然是一种有效的引用方式。

有什么想法吗?

【问题讨论】:

    标签: python properties scope decorator naming


    【解决方案1】:

    命名属性property的问题如下:

    class Foo(object):
        @property
        def property(self):
            return "ham"
    
        @property
        def other_property(self):
            return "spam"
    

    无法定义第二个属性,因为您在类定义中隐藏了名称 property

    您可以通过“重命名”property 来解决此问题,如您的示例所示,但如果我是您,我不会以这种方式弄乱内置插件。它使您的代码更难遵循。

    【讨论】:

    • 可以定义,只是不能这样。
    • @IgnacioVazquez-Abrams:是的,OP 的解决方法可以解决问题。将其添加到答案中。
    • @larsmans,我已经注意到你的问题,我通过将我的“def 属性”声明为类中的最后一个属性来解决它。它实际上可以解决问题并且可以运行。困扰我的只是日食的警告。当我运行脚本时它甚至不会警告我。
    • @Ernesto:我不使用 Eclipse,所以我不能告诉你如何关闭警告。我只是建议你不要调用属性property,但这是你的调用,它不受语言的 pov 影响。
    【解决方案2】:

    装饰器是普通函数,因此它们与其他函数位于相同的命名空间中。确实,您的 property 函数在类 Foo 内;但事实证明,那是python首先寻找装饰器名称的地方,所以有冲突。

    你可以从以下代码编译的事实中看出这一点:

    class Foo(object):
    
        def decfun(x): return "ham"
    
        @decfun
        def second(self, y): pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多