【问题标题】:Setting a Super's property in a Subclass' __init__在子类中设置 Super 的属性'__init__
【发布时间】:2011-06-16 05:43:01
【问题描述】:

我遇到了一个问题,我需要一个带有 vanilla setter 的自定义 getter。当我尝试在子类的__init__ 中设置属性时,就会出现问题。如果我将super__init__ 放在最后,它将覆盖Child 类中的集合。

显然让super 运行它的__init__ 首先解决了这个问题,我已经将assert 放入Parentsetx 以确保_x 已经被初始化。

我的问题是我是否在做一些明显错误的事情。在设置器中有一个断言对我来说感觉很笨拙。

注意:我之前没有在 init 中初始化 _x,直到 pylint 对我大喊大叫。

class Parent(object):

  def __init__(self):
    self._x = None

  def getx(self):
      return self._x

  def setx(self, value):
      #assert hasattr(self,'_x')
      self._x = value

  x = property(getx, setx)

class Child(Parent):

  def __init__(self, x):
      self.x = x
      super(Child, self).__init__() # sets x to None

if __name__ == '__main__':
  p = Parent()
  p.x = 123
  print p.x # prints 123

  c = Child(321)
  print c.x #prints None

【问题讨论】:

  • "如果我把 super 的 init 放在最后,它将覆盖 Child 类中的集合。"。放在第一位有什么问题?
  • 把它放在第一位没有错。只是感觉很奇怪。代码可以与断言一起正常工作,以确保 init 始终位于正确的位置。这更像是一个海军凝视问题。

标签: python inheritance properties


【解决方案1】:

我个人更喜欢以下解决方案:

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

class Child(Parent):
    def __init__(self, x):
        super(Child, self).__init__(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2012-06-04
    • 2017-06-17
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多