# 鸭子类型
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’, Golang也有Duck Type的概念。
# 多态
封装可以隐藏实现细节,使得代码模块化;
继承可以扩展已存在的代码模块(类);
而多态则是为了实现另一个目的 — 接口重用(一个接口多种实现)!
# 实现方法
1、定义函数实现
class A(object): def __init__(self, name): self.name = name def say(self): # 有 print 方法 print("I Love: " + self.name) class B(object): def __init__(self, name): self.name = name def say(self): # 有 print 方法 print("I Love Love Love: " + self.name) def func(obj): obj.say() # 多态接口,只要对象有say()方法 就是鸭子类型。 if __name__ == '__main__': a = A("Python") b = B("Python") func(a) func(b)
2、定义类实现
class A(object): def __init__(self, name): self.name = name def say(self): print("I Love: " + self.name) class B(object): def __init__(self, name): self.name = name def say(self): print("I Love Love Love: " + self.name) class Func(object): def __init__(self, obj): self.obj = obj def func(self): self.obj.say() # 多态接口,只要对象有say()方法 就是鸭子类型。 if __name__ == '__main__': a = A("Python") b = B("Python") Func(a).func() Func(b).func()
3、数组实现
class A(object): def __init__(self, name): self.name = name def say(self): print("I Love: " + self.name) class B(object): def __init__(self, name): self.name = name def say(self): print("I Love Love Love: " + self.name) if __name__ == '__main__': a = A("Python") b = B("Python") for obj in [a, b]: obj.say()