【发布时间】:2011-06-16 05:43:01
【问题描述】:
我遇到了一个问题,我需要一个带有 vanilla setter 的自定义 getter。当我尝试在子类的__init__ 中设置属性时,就会出现问题。如果我将super 的__init__ 放在最后,它将覆盖Child 类中的集合。
显然让super 运行它的__init__ 首先解决了这个问题,我已经将assert 放入Parent 的setx 以确保_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