注意區分當前的 Python 版本是 2.X 還是 3.X,Python 3.X 在 super 的使用上較之 Python 2.X 有較大的變化; 1. Python 2.x
class Contact(object): all_contacts = [] def __init__(self, name, email): self.name = name self.email = email Contact.all_contacts.append(self)class Friend(Contact): def __init__(self, name, email, phone): super(Friend, self).__init__(name, email) self.phone = phone
Python 2.x 的環境下,對於需要被繼承的父類,需要顯式地將父類繼承自 object 類,否則在子類使用 super(子類, self).__init__() 時會報 TypeError: must be type, not classobj.
這是因為 Python 2.x 中:
>> class A(): pass>> type(A)classobj>> class A(object): pass>> type(A)type
而且 Python 2.x 也並不將 classobj 視為 type.
當然子類中使用這樣的語句也是可以的:
class Friend(Contact): def __init__(self, name, email, phone): Contact.__init__(self, name, email, phone) self.phone = phone
python super()用法遇到TypeError: must be type, not classobj 2. Python 3.x
class Contact: all_contacts = [] def __init__(self, name, email): self.name = name self.email = email Contact.all_contacts.append(self)class Friend(Contact): def __init__(self, name, email, phone): super().__init__(name, email) self.phone = phone