【问题标题】:Attributes outside of __init__ in the presence of properties存在属性时 __init__ 之外的属性
【发布时间】:2017-11-28 05:27:23
【问题描述】:

Pylint 告诉我,我在 __init__ 之外设置了 _age,这在风格上并不好,我明白为什么。但是,如果我使用属性来确保我的属性是在某个时间间隔内设置的,那么在属性设置器中设置属性确实有意义。如何调和这两种相反的想法?

class Person:
    def __init__(self, age, height, weight):
        self.age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        if 18 <= age <= 81:
            self._age = age
        else:
            raise ValueError('You are either too old or too young')

【问题讨论】:

  • 如果你正在使用这样的 getter/setter,那么在你的 init 中你应该做self._age = age
  • self.age = age 应该是self._age = age
  • 如果它有助于解决您的问题,您应该考虑接受答案,以便将其标记为有帮助,以供未来的读者阅读。如果不是,请说明解决方案不起作用的原因。

标签: python properties attributes


【解决方案1】:

很明显idjaw给出的答案误解了代码的设计,跳过了他试图将'age'设置为1时应该引发的异常。

pylint 异常似乎是一个从未得到解决的known issue。您最好的选择就是在线使用# pylint: disable=attribute-defined-outside-init

【讨论】:

    【解决方案2】:

    您并没有真正正确地实现 getter/setter。您应该在 init 中执行的操作实际上是设置 self._age = age

    def __init__(self, age, height, weight):
        self._age = age
    

    有了这个更正,现在事情将按照您的设计按预期工作:

    p = Person(1, 2, 3)
    p.age = 10
    

    输出:

    ValueError: You are either too old or too young
    

    无一例外:

    p = Person(1, 20, 3)
    p.age = 22
    age = p.age
    print(age)
    

    输出:22

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多