面向对象的三大概念,多态。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
多态主要是针对继承来说的。
多个子类继承父类的属性和方法,子类也可以重写这些方法。当不同的子类重写同一个方法时,这个方法在不同的子类中就具有了不同的功能。
那么从这些子类中实例化出来的多个对象,分别调用该方法时,就会产生不同的结果。(这是当然的,每个子类都重写了该方法嘛。)
当我们不管子类重写的具体功能,直接用该方法写一个各个子类都通用的函数。
比如,我们重新定义一下人类类,人类都需要工作 work(),但是不同的职业工作类型不同,比如学生的 work() 应该是学习、司机的 work() 应该是开车、教师的工作是讲课等等。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def work(self):
# 人类有工作,但是不同的职业工作不同
# 使用 pass 占位咯
pass
# 学生类继承自人类
class Student(Person):
def work(self):
return '%s 的工作是学习...' % self.name
# 司机类继承自人类
class Driver(Person):
def work(self):
return '%s 的工作是开车...' % self.name
# 教师类继承自人类
class Teacher(Person):
def work(self):
return '%s 的工作是讲课...' % self.name
通过以上代码,我们实现了一个父类 Person, 三个子类。
我们写一个函数,暂时每个人的工作:
def show_work(obj):
print(obj.work())
注意obj.work()
, obj 可以是任意类型的对象,只要这个对象具备 work() 这个方法,这个函数就可以正常运行。
这也就是我们所谓的写一个通用的函数,不管你的对象是 Student、Driver、Teacher,都可以。
接下来我们使用这个函数:
s = Student('小明', 11)
show_work(s)
# 小明 的工作是学习...
t = Teacher('老张', 33)
show_work(t)
# 老张 的工作是讲课...
我们可以看到 show_work() 函数对于这些类的对象都可以使用。也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
当然其实 Python 这种动态语言多态没什么好谈的,因为动态语言的变量都没有指定类型。所以本身就只在乎变量(对象)拥有的属性和方法,并不关注到底是什么类型。
比如下面的例子,我们写一个加法函数,简单的打印参数 a+b 的结果。
def add(a, b):
print(a+b)
我们可以看到 a, b 参数没有限制任何类型。那么只要支持加法的类型,其实都可以使用该函数完成相加的操作。那么支持加法操作的类型有哪些呢?数值类型、字符串、列表、元组,都支持相加。
>>> add(5, 6)
11
>>> add('你', '好')
你好
>>> add([1,2,3], ['a','b','c'])
[1, 2, 3, 'a', 'b', 'c']
>>> add((5,6), (7,8))
(5, 6, 7, 8)
也就是,根本不 care 你的类型。
这也就是大家所耳熟能详的鸭子类型
。
一只鸟长得像鸭子,叫声像鸭子,走路也像鸭子,那它就是鸭子。
作为鸭子类型语言,我们不关心对象的类型,只关注这个对象的行为和特征。
所以你可以认为 Python 天然多态。
网友评论