2011-01-26 56 views
0

我碰到一个问题,我需要一个自定义getter和一个vanilla setter。当我尝试在子类的__init__中设置属性时,会发生问题。如果我将super的最后一个__init__覆盖Child类中的集合。在子类中设置超级属性'__init__

显然具有super来看,它是__init__首先修复的问题,我已经把一个assertParentsetx以确保_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 
+2

“如果我把超类的__init__持续它将覆盖在子类中集”。首先放置它有什么问题? – 2011-01-27 00:11:23

回答

4

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

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

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