2013-01-09 28 views
3

我試圖使用超()一個簡單的類層次結構以這種方式:使用類超()

class Employee(object): 
    def __init__(self, name): 
     self.name = name 

class FullTime(Employee): 
    def __init__(self, name, satOff, freeDays=[], alDays=[], programDays=[]): 
     global satsOffDict 
     global dayDict 
     super(Employee, self).__init__(name) 

不過,我得到這個錯誤:

TypeError: object.__init__() takes no parameters 

我讀過你需要製作父對象類型對象(新樣式類)以便超級工作。如果我改變Employee類(對象)類Employee(),我得到這個錯誤:

TypeError: must be type, not classobj 

這是怎麼回事?

+2

您可能希望小心地將列表作爲默認'__init__'來傳遞。這只是乞求有趣的行爲... http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – mgilson

回答

7

您使用當前super()

super(FullTime, self).__init__(name) 

super()看起來相對於第一個參數要求的方法;您開始從Employee開始搜索,尋找父類; object.__init__()是在這種情況下匹配的下一個父方法。

您需要使用當前類,因爲Python需要搜索Method Resolution Order中的基類;該排序取決於當前類如何從其基類派生(特別是如果存在多個繼承或基類最終被多次引用)。

在Python 3.x中,您可以使用不帶任何參數的super(),以及compiler will add an extra hint to your method,以便它可以確定從哪個類開始。

+1

你可以評論爲什麼這是?我一直在想。似乎派生類應該很容易被解釋器自動識別。是否有使用不同的東西作爲第一個參數? – acjay

+1

請注意,在3.x中,'super()'可以不帶任何參數並且工作正常。 –

+0

@ acjohnson55:基類的MRO依賴於繼承類。設想一個繼承自* two *超類的類。 –

2

當你在Python中使用super,你應該指定派生類型(即類中,你寫的調用)作爲第一個參數。

super(FullTime, self).__init__(name)