多态于多态性与鸭子类型
一:多态与多态性
多态: 同一种事物有多种形态 动物有多种形态:如狗、猫、猪
class Animal: # 同一类事物:动物 def talk(self): pass class Dog(Animal): # 动物的形态之一:狗 def talk(self): print("汪汪汪") class Cat(Animal): # 动物的形态之二:猫 def talk(self): print('喵喵!') class Pig(Animal): # 动物的形态之一:猪 def talk(self): print("哼哼哼!")
实例化得到三个对象
obj1 = Dog() obj2 = Cat() obj3 = Pig()
父类的功能是用来统一子类的,定标准的,只要看父类功能就知道子类也有
多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种:例如obj1、obj2、obj3都是动物,但凡是动物肯定有talk方法,于是我们可以不用考虑它们三者的具体是什么类型的动物,而直接使用 obj1.talk()
汪汪汪
obj2.talk()
喵喵!
obj3.talk()
哼哼哼!
在多态性背景下用的继承,父类的功能其实不是真的拿来给子类用的,而是用来给子类定标准的,用来统一子类的,只需要把父类的功能规定好了,子类就肯定有,这样的好处是只要看父类就知道子类有什么功能 更进一步,我们可以定义一个统一的接口来使用 def talk(animal): # 定义一个函数talk 传进来参数就叫动物 animal.talk() # 只要是动物就肯定有talk方法
三个对象统一用一个函数talk去调,用起来统一了
talk(obj1) talk(obj2) talk(obj3) 综上我们得知,多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名 import abc
指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法 def talk(self): # 抽象方法中无需实现具体的功能 pass
class Dog(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准 def talk(self): print("汪汪汪")
class Cat(Animal): def talk(self): print('喵喵!')
class Pig(Animal): def tell(self): # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化 print("哼哼哼!")
obj1 = Dog() obj2 = Cat() obj3 = Pig()
obj1.talk() obj2.talk() obj3.talk()
但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度,如下
三者看起来都像,三者都有talk功能,然而它们并没有直接的关系,且互相独立
class Dog:
def talk(self):
print("汪汪汪")
class Cat: def talk(self): print('喵喵!')
class Pig: def talk(self): print("哼哼哼!")
- 面向对象 - 1.在子类中重用父类的属性/2.组合/3.抽象类/4.多态与多态性/5.鸭子类型
- 面向对象三大特性——多态(含鸭子类型)
- 面向对象之组合、封装、多态性、鸭子类型
- 麦子学院——Python面型对象编程(P11鸭子类型与多态)
- 鸡啄米:C++编程入门系列之四十四(多态性:多态的概念和类型)
- python学习之继承 多态 鸭子类型
- python-封装方法-封装的实现原理-property装饰器-多态-多态之ABC模块-鸭子类型
- Python多态、鸭子类型
- [py]python多态-动态语言的鸭子类型
- C++编程入门系列之四十四(多态性:多态的概念和类型)
- Python:多态、协议和鸭子类型
- Python实现多态、协议和鸭子类型的代码详解
- 命名空间、闭包、上下文管理器、鸭子类型与多态(10)
- JAVA多态与类型转化分析-------》域没有多态性
- 归一化程序设计,抽象类,接口类,多态,鸭子类型
- python多态和鸭子类型
- python之面向对象性封装,多态,以及鸭子类型
- Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)
- 四十四、多态性:多态的概念和类型
- 面对对象三大特征:继承 多态(鸭子类型)(面试题)