3-1鸭子类型与多态

2019-03-10  本文已影响0人  xgnb

什么是鸭子类型
维基百科:当你看到一只鸟走起来像鸭子,游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被成为鸭子。
我们所有的类都共同实现了一个方法(方法名一样),这一系列类就可以归为一种类型,在调用他的时候我们就可以同时调用该方法
什么是多态
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。

class Cat:
    def say(self):
        print('i am a cat')


class Dog:
    def say(self):
        print("i am a dog")


class Duck:
    def say(self):
        print("i am a duck")


animal_list = [Cat, Dog, Duck]
for animal in animal_list:
    animal().say()

注意:
在Java中的多态,子类需要继承与同一个父类并且覆盖掉父类的一些方法才能定义多态,这一点与python不同。
在python中我们不需要继承同一个父类只需要实现同一个方法就行了。

加深理解

class Company:
    def __init__(self, employee_list):
        self.employee = employee_list

    def __getitem__(self, item):
        return self.employee[item]

    def __str__(self):
        return '-'.join(self.employee)

# 关于一些类型定义的方法 比如 list中的 extend(接受的类型不止是list)详情看下面

li = ['q', 'w', 'e', 'r']
li_e = ['t', 'y', 'u']
company = Company(['sb', 'is', 'you'])  # 因为定义了__getitem__魔法函数,它变得可迭代

li.extend(li_e)  # extend 可接受的参数类型是 iterable, 所以不仅限于常识中我们所知道只能接收list
print("After first extended----->", li)
print("li will extend company")
li.extend(company)
print("After second extended------>", li)

总结:

严格来说python可实现鸭子类型但是实现不了多态,因为从语言的本身来讲他原生就支持多态。

上一篇 下一篇

猜你喜欢

热点阅读