當看到一只鳥 走起來像鴨子,游泳起來像鴨子,叫起來也像鴨子。
那么這只鳥就可以被稱為鴨子。"""
定義三個類,貓 狗 鴨子
"""classCat(object):defsay(self):print("i an a cat")classDog(object):defsay(self):print("i an a dog")
classDuck(object):defsay(self):print("i an a duck")animal = Cat
animal().say()animal_list =[Cat,Dog,Duck]for animal in animal_list:animal().say()"""
java
會寫一個anamal類
并且指明子類繼承某個類并且重寫父方法
Aniaml an =Cat()
an.saypython
可以不繼承繼承其中任何父類
需要做的就是 都要去取say這個父方法鴨子:所有的類,都實現(xiàn)了一個共同的方法,這個方法名字是一樣的#####################################################################
可迭代對象:iterable
list set 等待, 例如extend方法,會調(diào)用__iter__ 或者__getitem__
a = [1,2]
b = [3,4]
a.enxtend(b)
b不一定是list,只要是可迭代的對象就可以實現(xiàn),是因為都實現(xiàn)了以上的魔法函數(shù)
魔法函數(shù),充分的利用了鴨子類型。
#####################################################################
"""
抽象基類 abc模塊
"""python是動態(tài)語言,是沒有變量類型的,可以指向任何類型。
動態(tài)語言 只有運行的時候,才能知道錯誤。
動態(tài)語言少了編譯時,檢查錯誤的環(huán)節(jié)python信奉的是鴨子類型,貫穿python整個設(shè)計理念。
python的一個類,到底有什么特性或者屬于類型
是看里面到底實現(xiàn)了哪些魔法函數(shù)抽象基類:
首先,抽象基類是不能實例化的。所有繼承這個基類的類,必須覆蓋 基類 設(shè)定好的方法"""# 我們?nèi)z查某各類是否有某種方法classCompany(object):def__init__(self,employee_list):self.employee = employee_listdef__len__(self):returnlen(self.employee)
com = Company(["1","2"])print(len(com))# 判斷是否有 __len__這個函數(shù) True/Falsehasattr(com,"__len__")"""
java的話,更傾向于判斷是否 是指定的類型
isinstance(com,Sized)python
from collections.ab import Sized
isinstance(com,Sized)
"""# @abc.abstractmethod"""
# 我們需要強制某個子類必須實現(xiàn)某個方法例如 實現(xiàn)了一個web框架,集成cache(未來可以使用redis,cache,memorychache)
需要設(shè)計一個抽象基類,指定子類必須實現(xiàn)某些方法
import abc
class Dog(metaclass=abc.ABCMeta):@abc.abstractmethoddef say(self):pass
class A(Dog):pass
A()
這樣如果A 繼承Dog類,沒有實現(xiàn)say方法的話,是不能實例化的。
TypeError: Can't instantiate abstract class A with abstract methods say
"""