2011-01-26 45 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)