1. 程式人生 > >python筆記(介面類和抽象類)

python筆記(介面類和抽象類)

一、介面類:(python原生不支援,預設多繼承,所有的方法都必須不能實現)

from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):     #元類 預設的元類 type
    @abstractmethod
    def pay(self):
        raise NotImplemented    #沒有實現這個方法

class Wechat:
    def pay(self,money):
        print('已經用微信支付了%s元'%money)
class Alipay:
    def pay(self,money):
        print('已經用支付寶支付了%s元'%money)

class Applepay:
    def fuqian(self,money):
        print('已經用Applepay支付了%s元'%money)

def pay(pay_obj,money):        #統一支付入口
    pay_obj.pay(money)
wechat = Wechat()
ali    = Alipay()
apple_pay = Applepay()

pay(wechat,200)
pay(ali,300)
pay(apple_pay,100)

輸出結果:

>>已經用微信支付了200元
  File "D:/Python/python_txt/GUI進度條/GUI.py", line 1135, in pay
  已經用支付寶支付了300元
  pay_obj.pay(money)AttributeError: 'Applepay' object has no attribute 'pay'

二、抽象類:(python原生支援,不支援多繼承,抽象類中方法可以有一些程式碼實現)

from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
swim_animal = Swim_Animal()
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
walk_wnimal = Walk_Animal()
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
fly_animal = Fly_Animal()

class Tiger(Walk_Animal,Swim_Animal):
    def walk(self):
    def swim(self):
        pass
class Swan(Walk_Animal,Fly_Animal,Swim_Animal):pass

tiger = Tiger()
tiger.walk()

1、抽象類規範
一般情況下單繼承能實現的功能都是一樣的,所以在父類中可以有一些簡單的基礎實現
多繼承的情況,由於功能比較複雜,所以不容易抽象出相同的功能的具體實現寫在父類中

2、抽象類還是介面類:面向物件的開發規範
(1)python中沒有介面類:java裡有介面Interface這個概念
(2)python中自帶多繼承,所以我們直接用class來實現了介面類
(3)python中支援抽象類:一般情況下單繼承不能例項化
(4)多型python天生支援多型(動態強型別的語言)
3、鴨子型別
(1)不崇尚根據繼承所得來的相似
(2)我只是自己實現自己的程式碼就可以了
(3)如果兩個類剛好相似,並不產生父類的子類的兄弟關係,而是鴨子型別
例:tuple list 這種相似是自己寫程式碼時約束的,而不是通過父類約束的
(4)優點:鬆耦合 每個相似的類之間都沒有影響

class List:
    def __len__(self):pass
class Tuple:
    def __len__(self):pass
def len(obj):
    return obj.__len__()
l = Tuple()
len(l)

(5)介面類和抽象類在python當中的應用點並不是非常必要

三、複習:
1、抽象類和介面類
(1)本質是做程式碼規範用的,希望在子類中實現和父類方法名字完全一樣的方法
(2)java的角度上看是有區別的:
java本來就支援單繼質所以就有了抽象類
java沒有多繼承所以為了介面離原則,設計了接這個概念,支援多繼承了
2、python及支援單繼承也支援多繼,所以對於介面類和抽象類的區別就不那麼明顯了, 甚至在 python中沒有內建介面類

3、多型和鴨子型別:
(1)多型: python天生支援多型
(2)鴨子型別:不依賴父類的情況下實現兩個相似的類中的同名方法