概述
python是一门解释语言,但是同java等静态语言一样,是可以通过继承的方式实现多态。而且python还有一个自己的特殊实现多态的方法,就是通过鸭子类型,来实现多态。
继承多态
通过严格的继承父类,重写父类的方法实现多态
class Person(object):
def __init__(self, name, work=None):
self.name = name
self.work = None
def msg(self):
# 重载父类的msg方法
print('my name is ' + self.name)
class Teacher(Person):
def __init__(self, name, work='teacher'):
super().__init__(name, work)
def msg(self):
print('my name is ' + self.name + ', my work is ' + self.work)
class Coder(Person):
def __init__(self, name, work='coder'):
super().__init__(name, work)
def msg(self):
print('my name is ' + self.name + ', my work is ' + self.work)
def show_msg(obj):
obj.msg()
if __name__ == '__main__':
laowang = Person('laowang')
lw_t = Teacher('lw')
lw_c = Coder('wcy')
# 这些都是通过继承方式,创建的新对象,
# 严格有Person的所有属性和方法,所以这种多态很好理解
show_msg(laowang)
show_msg(lw_t)
show_msg(lw_c)
鸭子多态
python独特的实现多态的方式,通过Duck Typing。简而言之,不继承父类Person,但是也拥有Person一样的方法或者属性。即看起来像,就行。
# 接着上面的代码接着写
class Animal(object):
def msg(self):
print('animal do not need work')
# 严格意义上,Animal并没有继承Person父类
# 但是它模仿了Person父类,实现了msg方法,看起来像鸭子而已
cat = Animal()
# 所以由于python的解释性,将其定义为鸭子类型,同样实现了多态
show_msg(cat)