1. 程式人生 > 實用技巧 >python基礎-面向物件(六)類的繼承

python基礎-面向物件(六)類的繼承

一.什麼是繼承?

繼承:類的繼承就跟現實生活一樣,父、子、孫。父類又稱為基類

繼承分為單繼承和多繼承

class Parent1:
    pass
class Parent2:
    pass
class Son1(Parent1): #單繼承
    pass
class Son2(Parent1,Parent2): #多繼承
    pass

二.為什麼要繼承?

  1減少程式碼冗餘、提高重用性(程式碼重用就耦合了,這個不是重點)

  2 歸一化設計。(相同的程式碼有相同的功能,比如貓會吃喝拉撒,狗也會吃喝拉撒,定義基類,動物類,包含吃喝拉撒,是為了確保貓和狗都必須有吃喝拉撒,使用者一看到吃喝拉撒就知道是幹什麼的)

三.繼承了父類的什麼屬性?

  資料屬性和函式屬性都繼承了。

class Dad:
    money = 10

    def __init__(self, name):
        self.name = name

    def hit_son(self):
        print('%s正在打兒子' % self.name)


class Son(Dad):
    pass


son1 = Son('alex')
print(son1.money)  # 呼叫父類的資料屬性
son1.hit_son()  # 呼叫父類的函式屬性
print(Dad.__dict__
) print(Son.__dict__)

四.什麼時候用繼承?

1.當類之間明顯不同,但又有關聯的時候用組合(如學校和老師)

2.當類之間有很多相同的功能,提取這些功能做成基類,用繼承(如貓吃喝拉撒,狗也吃喝拉撒。可以做個動物基類,吃喝拉撒)

五.介面繼承,歸一化設計

歸一化設計。相同的程式碼有相同的功能,比如貓會吃喝拉撒,狗也會吃喝拉撒,定義基類,動物類,包含吃喝拉撒,是為了確保貓和狗都必須有吃喝拉撒,使用者一看到吃喝拉撒就知道是幹什麼的。

要求必須重寫,可以abc模組

import abc


class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    
def chi(self): pass @abc.abstractmethod def he(self): pass def la(self): pass def sha(self): pass class Dog(Animal): def chi(self): pass def he(self): pass dog1 = Dog()

六.繼承順序

經典類(沒有繼承object的)是深度優先。新式類是廣度優先。新式類可用__mro__檢視

class A:
    pass


class B(A):
    pass


class C(A):
    pass


class D(B):
    pass


class E(C):
    pass


class F(E, D):
    pass


print(F.mro())

繼承順序:先子類後父類。同時繼承多個,先繼承寫在前面的

七.子類中呼叫父類方法

class Vehicle:
    Country = 'China'

    def __init__(self, name, speed, power):
        self.name = name
        self.speed = speed
        self.power = power

    def run(self):
        print('開動啦')


class Subway(Vehicle):
    def __init__(self, name, speed, power, line):
        # Vehicle.__init__(self, name, speed, power)
        super().__init__(self, name, speed, power)
        self.line = line


subway1 = Subway('復興號', '100m/s', 'elc', '19號線')
print(subway1.name, subway1.speed)

如果父類名字修改後,程式碼都要改名字,為了避免這種情況,可使用super()代替父類的名字