多态,鸭子模型

Posted leiting7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态,鸭子模型相关的知识,希望对你有一定的参考价值。

多态

多态指的是同一种类型的事物,不同的形态

多态的目的:

多态也称之为‘多态性’,目的是为了 在不知道对象具体类型的情况下,统一对象调用的方法规范(比如:名字)

多态的表现“形式之一”就是继承

? 先抽象,再继承

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say henghengheng')

Python的多态性是指:在不考虑实例类型的情况下使用实例,也就是说不同类型的实例有 相同的调用方法。比如人,猫,狗,等等只要是继承了animal就可以直接调用它的talk()方法

peo=People()
dog=Dog()
pig=Pig()

#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()

#更进一步,我们可以定义一个统一的接口来使用
def func(obj):
    obj.talk()

1.增加了程序的灵活性

  以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

2.增加了程序额可扩展性

  通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

抽象类

1、在python中内置的abc模块中,有一个抽象类

2、抽象类的作用:让子类必须遵循父类的编写规范

3.如何实现抽象类

父类需要继承abc模块中,metaclass=abc.ABCMeta

在父类的方法中,需要装饰上 abc.abstractmethod

注意 在python中不推荐使用抽象类。

注意: 子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个)

鸭子类型

1.什么是鸭子类型?

不同的对象,只要长得像鸭子,动作行为像鸭子,那它就是鸭子!

当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子.

鸭子类型是多态的一种表现形式。

2.为什么要有鸭子类型?
不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范。
所有的类,在定义时都按照统一的规范进行编写。

  • 多态的三种表现形式:
    • 继承父类 ****
      • 耦合度高,程序的可扩展性低
    • 继承抽象类 ***
      • 耦合度极高,程序的可扩展性极低
    • 鸭子类型: *****
      • 耦合度低,程序的可扩展性高
class A:
    def login(self):
        pass
    def register(self):
        pass

class B:
    def login(self):
        pass
    def register(self):
        pass

# A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
# 里面的相似的功能让其命名相同.
# A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.

## 个人理解:
    #你可以定义一个公共的接口, 简化代码 .牛逼人都这么干
    def func(obj):
       obj.register()
       obj.login()

__len__()

str1 = 'tank is very handsome!!!'
list1 = ['tank', 'is', 'very', 'handsome!!!']

# print(str1.__len__())
# print(list1.__len__())

# 自定义统计长度函数
def LEN(obj):
    return obj.__len__()

print(LEN(str1))
print(LEN(list1))

print(len(str1))
print(len(list1))

以上是关于多态,鸭子模型的主要内容,如果未能解决你的问题,请参考以下文章

python学习19类5之多态与鸭子模型

面向对象实例补充

3.1鸭子类型和多态

Python面向对象编程——多态多态性鸭子类型

python多态

面向对象之组合封装多态性鸭子类型