python 多态 知乎_Python鸭子类型和多态
鴨子類型
維基百科解釋:
當(dāng)看到一只鳥(niǎo)走起來(lái)像鴨子、游泳起來(lái)像鴨子、叫起來(lái)也像鴨子,那么這只鳥(niǎo)就可以被稱為鴨子。
duck typing:在程序設(shè)計(jì)中是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定。
在鴨子類型中,關(guān)注點(diǎn)在于對(duì)象的行為,能作什么;而不是關(guān)注對(duì)象所屬的類型。例如,在不使用鴨子類型的語(yǔ)言中,我們可以編寫一個(gè)函數(shù),它接受一個(gè)類型為"鴨子"的對(duì)象,并調(diào)用它的"走"和"叫"方法。在使用鴨子類型的語(yǔ)言中,這樣的一個(gè)函數(shù)可以接受一個(gè)任意類型的對(duì)象,并調(diào)用它的"走"和"叫"方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。任何擁有這樣的正確的"走"和"叫"方法的對(duì)象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。
# 多個(gè)類實(shí)現(xiàn)相同的方法
class Cat(object):
def say(self):
print("i am a cat")
class Dog(object):
def say(self):
print("i am a dog")
class Duck(object):
def say(self):
print("i am a duck")
animal_list = [Cat, Dog, Duck]
for animal in animal_list:
animal().say()
Output:
i am a cat
i am a dog
i am a duck
a = ['mark1', 'mark2']
b = ['mark2', 'mark']
name_tuple = ("mark3", 'mark4')
name_set = set()
name_set.add("mark5")
name_set.add("mark6")
a.extend(b)
a.extned(name_set)
a.extend(name_tuple)
print(a)
Output:
['mark1', 'mark2', 'mark2', 'mark', 'mark6', 'mark5', 'mark3', 'mark4']
對(duì)于 extend() 方法,它并不是說(shuō)要求傳入一個(gè) list,set,tuple,而是傳入一個(gè)可 iterable 的對(duì)象,那么如果一個(gè)類實(shí)現(xiàn)了 __getitem__() 方法,是不是就可以?
def extend(self, *args, **kwargs): # real signature unknown
""" Extend list by appending elements from the iterable. """
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
# Python 本身提供的,以雙下劃線開(kāi)始,雙下劃線結(jié)尾的方法,稱之為魔法函數(shù)
# __getitem__ 使得該類對(duì)象可迭代
def __getitem__(self, item):
return self.employee[item]
company = Company(['tom', 'bob', 'jane'])
a.extend(company)
print(a)
Output:
['mark1', 'mark2', 'mark2', 'mark', 'mark6', 'mark5', 'mark3', 'mark4', 'tom', 'bob', 'jane']
所以看到這里,本質(zhì)上 __getitem__() 和一開(kāi)始的 say() 是不是有異曲同工之妙?
總結(jié)
以上是生活随笔為你收集整理的python 多态 知乎_Python鸭子类型和多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面条代码 vs. 馄沌代码
- 下一篇: 妻子是前世渡你的人