【问题标题】:Why does PyCharm raise a warning when using @property here?为什么 PyCharm 在此处使用 @property 时会发出警告?
【发布时间】:2018-01-26 11:12:53
【问题描述】:

在教程中,我看到了两种用于使用@property 的实例属性命名。这是显示两者示例的代码。它们的工作方式似乎也不同。

class A:
    def __init__(self, x):
        self.x = x

    @property
    def x(self):
        return self.__x

    @x.setter
    def x(self, x):
        if x > 1000:
            self.__x = 1000
        else:
            self.__x = x  # Instance attribute __x defined outside __init__

class B:
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, x):
        if x > 1000:
            self._x = 1000
        else:
            self._x = x

a = A(9999)
print(a.x)  # -> 1000

b = B(9999)  # -> 9999
print(b.x)
b.x = 9999
print(b.x)  # -> 1000

我更喜欢 A 类的行为,因为似乎在 __init__ 中立即使用了 @x.setter,但是那段代码在 PyCharm 中给了我一个警告(我有它作为注释)。如果正确使用 Python 的属性设置器,为什么会有警告? B 类中没有警告。我能否以与 A 类中相同的方式在 __init__ 中调用 @x.setter 而没有警告?

【问题讨论】:

  • PyCharm 发出什么警告?显然,使用 setter 的代码(并因此利用了 setter)是优越的,是的。
  • 旁注:setter 可以简化为self._x = min(x, 1000)
  • @MartijnPieters “实例属性 __x__init__ 之外定义”,根据评论。 它是,OP,但这只是一个警告。
  • x 的行为没有什么不同。您正在观察差异,因为在 B.__init__ 中您设置的是 _x 而不是 x
  • 顺便说一句:不要使用双下划线名称修饰,例如self.__x 除非您了解它是什么并且它是有效的用例。

标签: python class properties pycharm naming


【解决方案1】:

这似乎是 PyCharm 中的一个错误:https://youtrack.jetbrains.com/issue/PY-25263

我找到的一个临时解决方案是在 __init__ 中添加 self._x = None。所以代码是:

class A:
    def __init__(self, x):
        self._x = None
        self.x = x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, x):
        if x > 1000:
            self._x = 1000
        else:
            self._x = x


a = A(9999)
print(a.x)  # -> 1000

【讨论】:

  • 这不是一个很好的解决方法,因为 setter 可能是一项昂贵的操作。
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2018-07-26
  • 2013-02-15
相关资源
最近更新 更多