2016-11-15 34 views
1

例如,請考慮以下類:在__init__完成之前,我應該在成員函數中使用實例變量嗎?

class A: 
    def __init__(self): 
     self.attr1 = value 
     self.attr2 = self.foo() 
    def foo(self): 
     return self.attr1 ** 2 

這是正確的方式,我應該通過attr1foo作爲一個參數或我應該定義foo外班?

+0

小心 - 您以這種方式調用的任何方法都是完全不安全的。例如,如果您在每次創建對象時都嘗試記錄對象的'repr',則__repr__'不能被子類安全覆蓋。 (有很多方法可以嘗試解決這個問題,但它們完全不安全。) – user2357112

回答

2

這是完全正常的,並且是一種常見模式 - 您只需要小心,在調用它之前您已經設置了所有foo()的關注屬性。

這經常用於定義容器類。例如,一個類似列表的類:

class ListLike: 
    def __init__(self, items=[]): 
     self.lst = [] 
     self.thingy = 'foo' 
     for item in items: 
      self.add(item) 

    def add(self, item): 
     self.lst.append(item) 
+0

請注意,可變默認參數是[不是一個好主意](http://stackoverflow.com/q/1132941/3001761) 。 – jonrsharpe

+1

@jonrsharpe,謝謝 - 我肯定知道可變默認值的問題。但是,如果你真的改變它,這只是一個問題,我不在這裏,所以它更簡單,更高效。或者,你可以做'items = None',然後用'item中的項目或[]:'。 –

相關問題