Python 在u_init中使用属性设置器__

Python 在u_init中使用属性设置器__,python,Python,如何在\uuuu init\uuuu中使用属性设置器,而不让pylint抱怨该属性已在\uuuu init\uuu外部定义 例如,下面的代码只生成一个异常,该异常在底部的try子句中捕获 class CircleNotUsingSetterInInit(object): def __init__(self, radius): # Notice underscore in 'self.radius self._radius = radius @p

如何在
\uuuu init\uuuu
中使用属性设置器,而不让pylint抱怨该属性已在
\uuuu init\uuu
外部定义

例如,下面的代码只生成一个异常,该异常在底部的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")
class CircleNotUsingSetterInit(对象):
定义初始(自身,半径):
#请注意“self.radius”中的下划线
自半径=半径
@财产
def半径(自身):
返回自我半径
@半径设定器
def半径(自身,半径):
如果半径小于0:
提升值错误(“半径必须为非负”)
自半径=半径
类CircleusingSetterInit(对象):
定义初始(自身,半径):
#注意“self.radius”中缺少下划线
自半径=半径
@财产
def半径(自身):
返回自我半径
@半径设定器
def半径(自身,半径):
如果半径小于0:
提升值错误(“半径必须为非负”)
#来自派林:
#在初始化外部定义的属性“\u radius”(在初始化外部定义的属性)
自半径=半径
循环使用SetterInit(5)
CircleNotUsingSetterInit(-1)
CircleusingSetterInit(5)
尝试:
CircleusingSetterInit(-1)
除值错误外:
打印(“捕获异常”)

我使用的是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
class CircleusingSetterInit(对象):
# ....
@半径设定器
def半径(自身,半径):
如果半径小于0:
提升值错误(“半径必须为非负”)
#pylint:disable=W0201
自半径=半径


W0201
是在init外部定义的
属性的代码,它是您根据收到的警告。您应该始终添加尽可能靠近源代码的禁用注释,以便pylint在文件的其余部分正常工作。

CircleusingSetterInit
是正确的行为,您可以忽略这一点,请注意,您只需使用在init外部定义的
disable=attribute
,这意味着读者无需查找代码@jonrsharpe,哦,是的,因为pylint v0.25.3我相信这是对的: