python中的繼承和多態

來源:互聯網
上載者:User

標籤:動物   animal   屬性   代碼   執行個體   查看   abc   ...   pass   

繼承

繼承的表現方式:

class Animal():    passclass Cat(Animal):  #animal是cat的父類,也可以說是基類    passprint(Cat.__bases__)#查看Cat的所有父類
單繼承

一個類只有一個父類

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

子類中專屬方法如何?

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

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)
子類中專屬屬性如何?多繼承

一個類有多個父類

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    passd = 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中的概念,目的是制定一個規範

介面類和抽象類別都不能被執行個體化

# 介面類#     支援多繼承,介面類中的所有方法都不能實現# 抽象類別#     不支援多繼承,抽象類別中的方法可以被實現
介面類
from abc import abstractmethod,ABCMeta#建立一個規範類class Payment(metaclass=ABCMeta):#指定元類    @abstractmethod    def pay(self):pass  #繼承該類的類必須實現本方法
介面類的多繼承

思考:

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

from abc import abstractmethod,ABCMetaclass Fly_Animal(metaclass=ABCMeta):    @abstractmethod    def fly(self):        passclass Walk_Animal(metaclass=ABCMeta):    @abstractmethod    def walk(self):        passclass Swim_Animal(metaclass=ABCMeta):    @abstractmethod    def swim(self):        passclass Bird(Fly_Animal,Walk_Animal):passclass Dog(Walk_Animal,Swim_Animal):passclass Duck(Walk_Animal,Swim_Animal,Fly_Animal):passb = Bird()  #  報錯  TypeError: Can‘t instantiate abstract class Bird with abstract methods fly, walk# 繼承規範介面類的類必須實現加@abstractmethod 裝飾器的方法,否則報錯
介面類的多繼承抽象類別

規定只使用單繼承

實現一個抽象類別

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

python天生支援多態

鴨子類型

python中的繼承和多態

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.