python - 在 __init__ 中使用 Property Setter

标签 python

如何在 __init__ 中使用 Property setter 而 pylint 不会提示该属性已在 __init__ 之外定义?

例如,下面的代码只产生一个异常,被底部的 try 子句捕获。

class CircleNotUsingSetterInInit(object):

    def __init__(self, radius):
        # Notice underscore in 'self.radius
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        self._radius = radius


class CircleUsingSetterInInit(object):

    def __init__(self, radius):
        # Notice lack of underscore in 'self.radius'
        self.radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        # From pylint:
        # Attribute '_radius' defined outside __init__ (attribute-defined-outside-init)
        self._radius = radius


CircleNotUsingSetterInInit(5)
CircleNotUsingSetterInInit(-1)
CircleUsingSetterInInit(5)
try:
    CircleUsingSetterInInit(-1)
except ValueError:
    print("caught exception")

我使用的是 Python 2.7.10。

最佳答案

在这种情况下,忽略警告是完全安全的。 Pylint 只是没有“看到”这一点,如果不进行语法分析,就很难注意到这一点。

您可以为 pylint 添加注释以在本地禁用此警告,如下所示:

class CircleUsingSetterInInit(object):

    # ....

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        # pylint: disable=W0201
        self._radius = radius

W0201attribute-defined-outside-init 的代码,这是您根据the docs 收到的警告。 .您应该始终在尽可能靠近源代码的地方添加此类禁用注释,以便 pylint 对文件的其余部分正常工作。

关于python - 在 __init__ 中使用 Property Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383581/

相关文章:

python -/posts/ 'PostList'的AssertionError应该包含 `queryset`属性,或者重写 `get_queryset()`方法

python - NLP 生成按列中的值分组的并置三元组数据框

python - XMPP SSL 握手失败

python - 在表格 View 单元格内添加多列

python - 从 matplotlib 中的点坐标绘制 3D 表面

python - 索引错误 : string index out of range - with len()

python - 尊重 argparse 隐私,并且。可用性

python - 如何在 Python 中拆分带限制的字符串

python - 对 GaussianHMM.fit([X]) 中的 X 感到困惑

python - ValueError : x and y must have same first dimension, 但形状为 (10, 1) 和 (90,)