简体   繁体   English

在__init__中使用属性设置器

[英]Using Property Setter In __init__

How do I use a Property setter in __init__ without pylint complaining that the attribute has been defined outside __init__ ? 如何在__init__使用Property setter而不让pylint抱怨该属性已在__init__之外定义?

For example, the following code only produces one exception which is caught in the try clause at the bottom. 例如,以下代码仅产生一个异常,该异常在底部的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")

I'm using Python 2.7.10. 我正在使用Python 2.7.10。

The warning is completely safe to ignore in this case. 在这种情况下,完全可以忽略该警告。 Pylint just doesn't "see" that, it's rather complex to notice without doing syntax parsing. Pylint只是没有“看到”它,如果不进行语法分析就很难注意到。

You can add a comment for pylint to disable this warning locally like this: 您可以为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

W0201 is the code for attribute-defined-outside-init , which is the warning you receive according to the docs . W0201attribute-defined-outside-init的代码,这是您根据docs收到的警告。 You should always add such disable comments as close to the source as possible, so that pylint works normally for the rest of the file. 您应始终在尽可能靠近源的位置添加此类禁用注释,以便pylint在文件的其余部分正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM