分享

三十五、Python面向对象:令你“吃惊”的多态

 乙甲壬 2020-07-11
三十五、Python面向对象:令你“吃惊”的多态

python面向对象之多态

1.什么是Python中的多态

在Python中,由于在定义变量时没有指定类型,类似弱类型语言,而对于弱类型的语言来说,在定义变量时并没有声明变量的类型,因此同一个变量可以在不同的地方引用不同的对象,因此,同一个变量在引用不同对象时在调用同一个方法时,可以呈现出不同的行为,具体呈现出哪一种行为完全由变量所引用的对象所决定,这就是多态。也是面向对象编程的三大特征之一。

2.Python中让你吃惊的多态?

在讲解Python中的多态时,好多人都会觉得不可思议,原来自己一直在使用多态,而自己却毫无察觉,下面来看一个例子:

class Cat: def say(self): print(f'我是喵星人, 我只喜欢喵喵叫')class Dog: def say(self): print(f'我是汪星人, 我喜欢汪汪照叫')# 定义变量x为Cat的实例x = Cat()# 调用x的say()方法x.say() # 我是喵星人, 我只喜欢喵喵叫# 将Dog()的实例的地址赋值给xx = Dog()# 调用x的say()方法x.say() # 我是汪星人, 我喜欢汪汪照叫

从上面的代码示例可知,同一个变量x在执行同一个方法say()时,由于在不同时间x指向的对象不同,因此呈现出了不同的行为,这就是多态,是不是看起来非常不可思议,也许你会感到非常失望,这种多态有什么用啊? 事实上,在Python中,多态是一种非常灵活的编程机制,下面来看另外一个例子。

3.Python中多态的“真正”用途

假如我有一个工厂来生产各种手机配件的,比如有充电宝、耳机、手机支架、手机膜等。

  • 先定义一个工厂类
class Factory:    def __init__(self, name):        self.name = name    def make_accessory(self, accessory):        print(f'开始生产配件:{accessory.name}')        accessory.produce(self)    def __str__(self):        return f'{self.name}'
  • 定义配件类
class PowerBank: def __init__(self, name): self.name=name def produce(self,factory): print(f'在 {factory} 生产充电宝')class HeadPhone: def __init__(self, name): self.name=name def produce(self,factory): print(f'在 {factory} 生产耳机')class ScreenProtector: def __init__(self, name): self.name=name def produce(self,factory): print(f'在 {factory} 生产手机膜')# 实例化工厂factory = Factory('华强北手机配置生产厂')factory.make_accessory(PowerBank('华为充电宝'))factory.make_accessory(HeadPhone('Oppo充电蓝牙耳机'))factory.make_accessory(HeadPhone('手机膜'))
三十五、Python面向对象:令你“吃惊”的多态

结果

从上面的例子可以体会到Python的多态的优势,这种通过参数的动态引用来调用引用后的对象中的方法非常灵活,动态改变后传入的对象只要具有指定的方法就行,至于该方法体现什么样的行为,则完全取决于传入对象本身。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约