类的三大特性:封装、继承、多态,什么是多态呢?
多态特性
举例:
办公室内部有运营、客服、程序员三个员工,三人正在闲聊,这时候老板进来,大喊:“干活”。三个人赶紧进入了干活的状态。
上面这个例子中, 老板对三个人发出的是同一个指令“干活”,但是三个人进入不同的干活的状态:
运营 - 写活动文案
客服 - 服务客户
程序员 - 面向产品经理编程
这种就叫多态,相同的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
, 定义了四个子类Operation
、Customer
、Pythoner
、Tester
,除了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("嘎嘎")
讨论区