请稍候,加载中....

多态与鸭子类型

类的三大特性:封装、继承、多态,什么是多态呢?

多态特性

举例:

办公室内部有运营、客服、程序员三个员工,三人正在闲聊,这时候老板进来,大喊:“干活”。三个人赶紧进入了干活的状态。

上面这个例子中, 老板对三个人发出的是同一个指令“干活”,但是三个人进入不同的干活的状态:

运营 - 写活动文案

客服 - 服务客户

程序员 - 面向产品经理编程

这种就叫多态,相同的action名,不同的action内容

上面这个例子用代码演示:

class Worker:
    def work(self):
        print("找工作")

class Operation(Worker):
    def work(self):
        print("搞活动")

class Customer(Worker):
    def work(self):
        print("搞用户")

class Pythoner(Worker):
    def work(self):
        print("搞代码")

class Tester(Worker):
    pass

上面定义了一个基类Worker, 定义了四个子类OperationCustomerPythonerTester,除了Tester没有重新定义work方法外,其余都定义了work方法

wangxiaoyan = Operation()
xiaofen = Customer()
luxp = Pythoner()
wurenxing = Tester()

workers = [wangxiaoyan, xiaofen, luxp, wurenxing]
for worker in workers:
    worker.work()

# 输出:
# 搞活动
# 搞用户
# 搞代码
# 找工作

多态的情况下,对各对象调用work方法,不用去考虑对象的类型,这一切都是对象根据自身调整,在Tester中,由于没有重新定义work方法,所以会向基类方向找,直到找到为止。

鸭子类型

鸭子类型是一种动态类型语言中的编程风格,它关注对象的行为而不是对象的类型.

鸭子类型来历:如果有一群鸟在你面前,你不知道什么鸟,这时候你打电话问鸟类学家,然后他会问你这鸟发出什么声,怎么移动的,多大的个,然后告诉你这是一个鸭子。

鸭子类型的核心思想是"如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子",即对象的类型并不重要,只要它具有特定的方法或属性即可

所以所谓鸭子类型就是我们不关注他具体的类型, 而是只关心能否具备特定的属性或者方法

class Bird:
    wings = 2
    claws = 2
    
    def sound(self):
        pass


class Dove(Bird):
    
    def sound(self, sound="咕咕"):
        print(sound)


class Duck(Bird):
    
    def sound(self):
        print("嘎嘎")


dove1 = Dove()

duck1 = Duck()

dove1.sound()
duck1.sound()
# 鸽子变成鸭子
dove1.sound("嘎嘎")

Python学习手册-