python 面向对象之多态性与鸭子类型

多态与多态性

什么是多态:

多态指的是一类事物有多种形态,比如动物有多种形态:人、狗、猪

class Animal:      #同一类:动物
    pass

class People(Animal):    #形态一:人
    pass

class Dog(Animal):    #形态二:狗
    pass

class Pig(Animal):     #形态三:猪
    pass

为何要有多态=》多态会带来什么样的特性==>多态性

# 多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象

class Animal: # 统一所有子类的方法
    def say(self):
        print('动物基本的发声频率。。。',end=' ')

class People(Animal):
    def say(self):
        super().say()
        print('嘤嘤嘤嘤嘤嘤嘤')

class Dog(Animal):
    def say(self):
        super().say()
        print('汪汪汪')

class Pig(Animal):
    def say(self):
        super().say()
        print('哼哼哼')


obj1=People()
obj2=Dog()
obj3=Pig()


obj1.say()
obj2.say()
obj3.say()

'''
动物基本的发声频率。。。 嘤嘤嘤嘤嘤嘤嘤
动物基本的发声频率。。。 汪汪汪
动物基本的发声频率。。。 哼哼哼
'''

更进一步:可以定义统一的接口,接收传入的动物对象

class Animal: # 统一所有子类的方法
    def say(self):
        print('动物基本的发声频率。。。',end=' ')

class People(Animal):
    def say(self):
        super().say()
        print('嘤嘤嘤嘤嘤嘤嘤')

class Dog(Animal):
    def say(self):
        super().say()
        print('汪汪汪')

class Pig(Animal):
    def say(self):
        super().say()
        print('哼哼哼')



obj1=People()
obj2=Dog()
obj3=Pig()


# 定义统一的接口,接收传入的动物对象
def animal_say(animal):
    animal.say()

animal_say(obj1)
animal_say(obj2)
animal_say(obj3)

'''
动物基本的发声频率。。。 嘤嘤嘤嘤嘤嘤嘤
动物基本的发声频率。。。 汪汪汪
动物基本的发声频率。。。 哼哼哼
'''

鸭子类型:

Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度,如下

class Cpu:
    def read(self):
        print('cpu read')

    def write(self):
        print('cpu write')

class Mem:
    def read(self):
        print('mem read')

    def write(self):
        print('mem write')


class Txt:
    def read(self):
        print('txt read')

    def write(self):
        print('txt write')


obj1=Cpu()
obj2=Mem()
obj3=Txt()

obj1.read()
obj1.write()

obj2.read()
obj2.write()

obj3.read()
obj3.write()

了解知识点:

多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名

import abc

# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化 ==> 不能实例化抽象类自己  obj=Animal()
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): # 抽象方法中无需实现具体的功能
        pass

class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
    def talk(self):
        pass

cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

 

posted @ 2020-04-10 15:21  耗油炒白菜  阅读(229)  评论(0编辑  收藏  举报