例如,請考慮以下類:在__init__完成之前,我應該在成員函數中使用實例變量嗎?
class A:
def __init__(self):
self.attr1 = value
self.attr2 = self.foo()
def foo(self):
return self.attr1 ** 2
這是正確的方式,我應該通過attr1
到foo
作爲一個參數或我應該定義foo
外班?
例如,請考慮以下類:在__init__完成之前,我應該在成員函數中使用實例變量嗎?
class A:
def __init__(self):
self.attr1 = value
self.attr2 = self.foo()
def foo(self):
return self.attr1 ** 2
這是正確的方式,我應該通過attr1
到foo
作爲一個參數或我應該定義foo
外班?
這是完全正常的,並且是一種常見模式 - 您只需要小心,在調用它之前您已經設置了所有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)
請注意,可變默認參數是[不是一個好主意](http://stackoverflow.com/q/1132941/3001761) 。 – jonrsharpe
@jonrsharpe,謝謝 - 我肯定知道可變默認值的問題。但是,如果你真的改變它,這只是一個問題,我不在這裏,所以它更簡單,更高效。或者,你可以做'items = None',然後用'item中的項目或[]:'。 –
小心 - 您以這種方式調用的任何方法都是完全不安全的。例如,如果您在每次創建對象時都嘗試記錄對象的'repr',則__repr__'不能被子類安全覆蓋。 (有很多方法可以嘗試解決這個問題,但它們完全不安全。) – user2357112