天天看點

python中的三大特點:封裝 繼承 多态

一、參考博文:https://blog.csdn.net/yangkaiorange/article/details/82461496

# 假如a和b子產品裡面都有一個test方法,誰調用完就屬于誰
from a import *

test()  # 屬于a

from b import *

test()  # 屬于b
           

二、重載(C語言):方法名相同,根據實參類型的不同調用不同的方法

# 方法1
def set_info(int number):
    ****

# 方法2
def set_info(char* str):
    ****

# 因為實參為字元串類型,是以調用方法2
s1.set_info('haha')
           

python基本沒有重載,隻有重寫,因為不允許出現多個相同的函數名(特殊除外:數字1+2+3,字元串1+2+3)

三、多繼承父類被重複調用,資源浪費

#coding:utf-8

class Parent(object):

    def __init__(self, name):
        print('父類Parent的init調用--->開始')
        self.name = name
        print('父類parent的init調用--->結束')

class Son1(Parent):

    def __init__(self, name, age):
        print('子類Son1的init調用--->開始')
        self.age = age
        Parent.__init__(self, name)  # 調用父類
        print('子類Son1的init調用--->結束')

class Son2(Parent):

    def __init__(self, name, gender):
        print('子類Son2的init調用--->開始')
        self.gender = gender
        Parent.__init__(self, name)
        print('子類Son2的init調用--->結束')

class Grandson(Son1, Son2):

    def __init__(self, name, age, gender):
        print('子子類Grandson的init調用--->開始')
        Son1.__init__(self, name, age)  # 單獨調用父類的初始化方法
        Son2.__init__(self, name, gender)
        print('子子類Grandson的init調用--->結束')

gs = Grandson('grandson', 12, '男')
print('姓名:', gs.name)
print('年齡:', gs.age)
print('性别:', gs.gender)
           
python中的三大特點:封裝 繼承 多态

多繼承中super調用所有父類的被重寫的方法,解決資源浪費(父類名改成super())

*args :以元組的形式儲存參數(多出來的參數)  

**kwargs :以字典的形式傳遞關鍵字參數(多出來的關鍵字)

#coding:utf-8


# *args 以元組的形式儲存參數(多出來的參數)  **kwargs 以字典的形式傳遞關鍵字參數(多出來的關鍵字)
class Parent(object):

    def __init__(self, name, *args, **kwargs):  # 為避免多繼承報錯,使用不定長參數,接收參數
        print('父類Parent的init調用--->開始')
        self.name = name
        print('父類parent的init調用--->結束')

class Son1(Parent):

    def __init__(self, name, age, *args, **kwargs):  # 為避免多繼承報錯,使用不定長參數,接收參數
        print('子類Son1的init調用--->開始')
        self.age = age
        super().__init__(name, *args, **kwargs)  # 為避免多繼承報錯,使用不定長參數,接收參數
        print('子類Son1的init調用--->結束')

class Son2(Parent):

    def __init__(self, name, gender, *args, **kwargs):  # 為避免多繼承報錯,使用不定長參數,接收參數
        print('子類Son2的init調用--->開始')
        self.gender = gender
        super().__init__(name, *args, **kwargs)  # 為避免多繼承報錯,使用不定長參數,接收參數
        print('子類Son2的init調用--->結束')

class Grandson(Son1, Son2):

    def __init__(self, name, age, gender):
        print('子子類Grandson的init調用--->開始')
        # 多繼承時,相對于使用類名.__init__方法,要把每個父類全部寫一遍
        # 而super隻用一句話,執行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因
        # super(Grander, self).__init__(name, age, gender)
        super().__init__(name, age, gender)  # 單獨調用父類的初始化方法
        print('子子類Grandson的init調用--->結束')

print(Grandson.__mro__)  # 列印的是誰super就按順序調用誰。python解釋器C3算法

gs = Grandson('grandson', 12, '男')
print('姓名:', gs.name)
print('年齡:', gs.age)
print('性别:', gs.gender)
           

執行結果: 

python中的三大特點:封裝 繼承 多态