日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

[每日一題]7、Python中的super()函數(shù)

 Four兄 2019-08-25

第一時間收到精彩推送!

Python Every Day, 第 7 天


我們知道Python是一門面向?qū)ο蟮木幊陶Z言,既然面向?qū)ο缶蜕俨涣死^承。

繼承:表示子類可以使用其父類中方法。

在Python中,可以通過super() 函數(shù)來調(diào)用父類的方法。

如下所示,我定義了一個 Person 類,有 說、唱、rap、籃球 這四個 方法。

class Person():
    def speak(self):
        print('i can speak')

    def sing(self):
        print('i can sing')

    def rap(self):
        print('i can rap')

    def basketball(self):
        print('i can basketball')

如果只有一個類 直接實例化.函數(shù)名的方式進行調(diào)用即可。

假設我現(xiàn)在有個Student (學生類),同樣也可以說、唱、Rap、籃球。如果再重新寫一遍這四個函數(shù)就比較麻煩。因此這個時候就可以用到繼承。學生類來繼承Person類(也就是說Student是Person的子類,Person是Student的父類)

如下所示

# Student(Object) 括號中的類,表示要繼承的類
class Student(Person):
    pass

# Student1(Object) 括號中的類,表示要繼承的類
class Student1(Person):
    def study(self):
        print('i like study')

if __name__ == '__main__':
    # 實例化一個Student對象
    s = Student()
    s.rap()  #  i can rap
    s.basketball() # i can basketball

    s1 = Student1()
    s1.rap()  # i can rap
    s1.study() # i like study

Student、Student1 都繼承了Person類。

Student只會 說、唱、rap、籃球。而Student1 還喜歡學習??梢栽俣x一個study函數(shù)。

上面只是用簡單的代碼介紹了一下Python中的繼承。還沒有說到如何用super()來調(diào)用父類的方法。

在子類中如果需要去掉用父類的方法時,可以通過 super(). 父類方法 的形式完成。

示例:

class A:
    def get_name(self):
        return 'my name is xiaoming'


class B(A):
    def my_info(self):
        print('i am 18 years old')
        # 通過super() 函數(shù) 調(diào)用父類A 中的get_name函數(shù),返回字符串
        print(super().get_name())
        print('i like rap and basketball')


if __name__ == '__main__':
    b = B()
    '''
    輸出:
    i am 18 years old
    my name is xiaoming
    i like rap and basketball
    '''

    b.my_info()

在B方法中調(diào)用my_info 時,可以直接通過父類A中的get_name 方法 獲取到名字。

問題: 如果一個子類繼承了兩個父類,并且父類中的方法名相同。那究竟會調(diào)用哪個類呢?

這個問題可以通過類的內(nèi)置屬性 __mro__ 去查看調(diào)用順序。這個方法主要是在多繼承時判斷方法、屬性的調(diào)用路徑。

class A:
    num = 1
    def method(self):
        print('A ..method')

class B:
    num = 2
    def method(self):
        print('B .. method')


class C(A, B):
    num = 3
    pass

if __name__ == '__main__':
    c = C()
    print(C.__mro__)  # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
    print(c.num)  #  3
    c.method()  # A ..method

如上,C.__mro__ 打印結果可以執(zhí)行順序為 C -> A - >B

因此print(c.num)。因為c中有num屬性,所以會打印3.

執(zhí)行c.method時 。因為c中沒有method屬性,會去A中查找,則輸出 A..method。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多