Python 极简教程(二十二) - 面向对象(3)多态

面向对象的三大概念,多态。

多态: 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

多态主要是针对继承来说的。

多个子类继承父类的属性和方法,子类也可以重写这些方法。当不同的子类重写同一个方法时,这个方法在不同的子类中就具有了不同的功能。

那么从这些子类中实例化出来的多个对象,分别调用该方法时,就会产生不同的结果。(这是当然的,每个子类都重写了该方法嘛。)

当我们不管子类重写的具体功能,直接用该方法写一个各个子类都通用的函数。

比如,我们重新定义一下人类类,人类都需要工作 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 天然多态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值