super().__init__()的用法
""" 推薦使用的派生方法:super().__init__() --super()的屬性查找順序是從當前位置開始找,根據mro列表,當前沒有就往上找。 super() 函數是用於調用父類的一個方法。 super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題, 但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鑽石繼承)等種種問題。 MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。 --super(),會得到一個特殊的對象,該對象就是專門用來 訪問父類中的屬性的(嚴格按照繼承的關系) --super().__init__(),此處__init__(), 括號中不需要傳值self。 --在Python2中,super()的完整用法是super(自己類名,self), 在Python2中需要寫完整,而Python3中可以簡寫為super()。
--用法解析:
在子類的__init__方法中使用 super().__init__() , 就相當於把父類的 __init__構造方法拿過來用, 並且可以對父類的__init__方法進行補充(比如添加成員屬性/方法) ,
也就相當於把父類的__init__方法繼承過來了, 之后用子類實例化一個對象后, 這個對象可以點出父類對象的成員屬性/方法, 當然也可以點出自己類對象的成員屬性/方法
原本的話子類中的__init__方法會覆蓋掉父類的__init__方法, 導致無法通過實例化子類的類對象去給父類的類對象添加成員屬性/方法,也無法調用父類類對象的屬性/方法
"""普通情況""" class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex,stu_id): self.stu_id=stu_id def choose_course(self): pass obj2 = MyClass2("chen",12,1,"123") # 雖然接收了這些參數,但是並沒有給對象添加屬性 # print obj2.name # 會報錯,子類的類對象沒有name屬性 print(obj2.__dict__) # {"stu_id":"123"} # 如果把子類的__init__方法注釋掉,實例化傳參obj2 = MyClass2("chen",12,1),就會調用父類的__init__方法,也就是說通常情況下,父類的__init__方法和子類的__init__方法只能用一個 """使用super().__init__()后""" class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex,stu_id): super().__init__(name,age,sex) self.stu_id=stu_id def choose_course(self): print('%s is choosing course'%self.name) # return 'true' # 函數自帶返回值none,如果把return 'true'這一行注釋的話, # 那么打印的print(stu1.choose_course())這個結果就會是:tank is choosing course # 並且還會打印出有None。 stu1=OldboyStudent('tank',19,'male',1) print(stu1.__dict__) print(stu1.choose_course()) 上述程序輸出的打印結果如下所示: {'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1} tank is choosing course None
class MyClass1(object): age = 18 def __init__(self): self.name = "chen" class MyClass2(MyClass1): def __init__(self): super(MyClass2, self).__init__() # self["key1"] = 666 # 會報錯'MyClass2' object does not support item assignment self.sex = "男" class MyClass3(dict): def __init__(self,**kwargs): super(dict, self).__init__() # 注意第一個參數是dict,而不是自己的類 self["key1"] = 666 self.sex = "女" # obj2 = MyClass2() # print(obj2.name, obj2.age, obj2.sex) # chen 18 男 obj3 = MyClass3() #######取值 print (obj3.sex) # 女 print( obj3["key1"]) # 666 #######添加 obj3['love']='sleep' #添加 print(obj3) ######修改 obj3['love']='swiming' print(obj3) ######刪除 obj3.pop('love') print(obj3)
Myclass3 繼承了dict類. 並且在__init__方法中使用 super(dict, self).__init__() ,使得Myclass3實例化的類對象具有dict字典的特征
即可以對Myclass3類對象進行字典操作, 比如添加鍵值對, 通過鍵取值等等