python中的繼承和多態

繼承

繼承的表現方式:java

class Animal():
    pass
class Cat(Animal):  #animal是cat的父類,也能夠說是基類
    pass
print(Cat.__bases__)#查看Cat的全部父類

單繼承

一個類只有一個父類python

狗和鳥都是動物,都擁有吃喝這兩種技能,但游泳是狗的特殊技能,飛逝鳥的特殊技能,只能在本類中進行擴展算法

子類中獨有方法如何實現

實現了子類中獨有方法,那子類有獨有的屬性呢?我養了一個小泰迪,我給他起個名字,可是鳥就沒有這個屬性ide

class Animal():
    def __init__(self,kind):
        self.kind = kind
    def eat(self):
        print('eat...')
    def drink(self):
        print('drink...')

class Dog(Animal):
    def __init__(self,kind,name):
        # Animal.__init__(self,kind)  #爲繼承的父類中的屬性初始化賦值
        super().__init__(kind)  #用super找到父類   跟上句話的效果相同
        self.name = name    #爲本類獨有的屬性進行初始化賦值,派生屬性
    def swimming(self):
        print('dog swimming')

class Bird(Animal):
    def fly(self):
        print('bird flying')
    def eat(self):
        print('bird eat')

b1 = Bird('麻雀')
b2 = Dog('tiddy','judy')
print(b1.kind)
print(b2.name)
子類中獨有屬性如何實現

多繼承

一個類有多個父類spa

class A():
    def fun(self):
        print('aaa')
class B():
    def fun(self):
        print('bbb')
class C():
    def fun(self):
        print('ccc')
class D(A,B,C):     #繼承A,B,C
    pass
d = D()
d.fun()     #aaa--->調用A類中的fun方法,按照繼承順序A
簡單多繼承
鑽石繼承
'''
A
B C

D E
F
F繼承DE,D繼承B,E繼承C,BC繼承A
順序是:F->D->B->E->C->A
'''
# 另外一個問題,關於super,super真的是找父類嗎?
# class A():
#     def fun(self):
#         print('a')
# class B(A):
#     def fun(self):
#         super().fun()   #-->找C
#         print('b')
# class C(A):
#     def fun(self):
#         super().fun()   #-->找A
#         print('c')
# class D(B,C):     #繼承B,C
#     def fun(self):
#         super().fun()   #-->找B
#         print('d')
# d = D()
# d.fun()     #打印結果是  a c b d
# #以菱形多繼承爲例,發現是根據優先算法找到的上一級
super問題

接口類和抽象類

python中實際上是沒有接口的概念的,接口類和抽象類是java中的概念,目的是制定一個規範code

接口類和抽象類都不能被實例化blog

# 接口類
#     支持多繼承,接口類中的全部方法都不能實現
# 抽象類
#     不支持多繼承,抽象類中的方法能夠被實現

接口類

from abc import abstractmethod,ABCMeta
#建立一個規範類
class Payment(metaclass=ABCMeta):#指定元類
    @abstractmethod
    def pay(self):pass  #繼承該類的類必須實現本方法

接口類的多繼承

思考:繼承

如何在代碼盡不重複的狀況下,定義三個類:1.鳥-->會飛,會走 2.狗-->會游泳,會走 3.鴨子-->會游泳,會飛,會走接口

from abc import abstractmethod,ABCMeta
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
class Bird(Fly_Animal,Walk_Animal):pass
class Dog(Walk_Animal,Swim_Animal):pass
class Duck(Walk_Animal,Swim_Animal,Fly_Animal):pass
b = Bird()  #  報錯  TypeError: Can't instantiate abstract class Bird with abstract methods fly, walk
# 繼承規範接口類的類必須實現加@abstractmethod 裝飾器的方法,不然報錯
接口類的多繼承

抽象類

規定只使用單繼承it

實現一個抽象類

import
abc #建立一個規範類 class Payment(metaclass=abc.ABCMeta):#指定元類 @abc.abstractmethod def pay(self):pass #繼承該類的類必須實現本方法

多態

python天生支持多態

鴨子類型

相關文章
相關標籤/搜索