2011-04-12 51 views
19

在你打電話給super()之前,你有沒有想做一些處理的情況?在python中,super()總是在方法中首先調用。是否有情況應該在以後被調用?

這是一個人爲的例子。有更好的例子嗎?這是否被認爲是pythonic?

class Base(object): 
    def __init__(self, name): 
     print "Base %s created" % name 
     self._name = name 

class UpperBase(A): 
    """ Similar to base but the name is in uppercase. """ 
    def __init__(self, name): 
     name = name.upper() 
     super(UpperBase, self).__init__(name) 
+0

您的示例恰恰*是在您向父類上調之前執行其他計算的情況。我知道我經常在定義'Thread'子類時經常這樣做 - 我通常在那裏有一些邏輯來根據構造函數參數給線程一個有意義的名字。 – ncoghlan 2011-04-12 12:57:51

+0

我想你應該在調用'super()..'方法之前避免*修改*實例狀態。所以只需對參數(變換,驗證等)進行一些計算即可,但不應改變實例的狀態。 – frans 2017-08-30 13:48:54

+0

@frans爲什麼? (我看過很多代碼都是這樣做的) – TomOnTime 2017-08-30 14:23:44

回答

22

有時你需要調用super()之前驗證參數:

class UpperBase(Base): 
    def __init__(self, name): 
     if not name_valid(name): 
      raise ValueError() 
     super(UpperBase, self).__init__(name) 

我不明白爲什麼這不會是Python的,因爲它是這樣做的最簡單的方法,它的簡單。 另外,閱讀@JHSaunders的評論,他說得很好。

+10

Ya,python中的init方法不是像C++這樣的構造函數,它不會執行實際的內存分配,到init被調用時,內存被分配,所以它實際上只是一個正常的方法,碰巧有一定的語義(它是在一個對象被構造之後調用的),所以總之你應該能夠調用它(如果我錯了某個人,請糾正我) – JHSaunders 2011-04-12 11:26:14

+1

在C++中,構造函數不分配內存,而是初始化內存,其他事情也可以在那裏完成。C++構造函數之間確實存在很多差異nd Python的'__init __()' - 方法,但這個問題一般是關於'super()',而不是'super().__ init __()'。 – frans 2017-08-31 09:25:28

+0

在Python 3中,你可以簡單地調用'super()'而不是'super(UpperBase,self)':https://docs.python.org/3/library/functions.html#super – phoenix 2018-02-14 12:55:41

相關問題