super().__init__()用法


 

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類對象進行字典操作, 比如添加鍵值對, 通過鍵取值等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM