美文网首页
1_5_多态与duck typing

1_5_多态与duck typing

作者: li_coder | 来源:发表于2018-06-07 17:49 被阅读0次

多态:同一种事物的多种形态
多态性:一种调用方式,不同的执行效果

1. 多态

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

import abc
import six

# 同一类事物:动物
@six.add_metaclass(abc.ABCMeta)
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 aoao')

2. 多态性

具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数.
向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。
消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

#多态性:一种调用方式,即,定义统一的接口.不同的执行效果
#多态性依赖于:继承
def talk(obj):  # obj这个参数没有类型限制,可以传入不同类型的值
    obj.talk()  # 相同的调用逻辑,不同的执行结果

talk(Person())
talk(Dog())
talk(Pig())

3. duck typing

鸭子类型是多态(polymorphism)的一种形式.在这种形式中,不管对象属于哪个,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作.即忽略对象的真正类型,转而关注对象有没有实现所需的方法、签名和语义.

python中的鸭子类型允许我们使用任何提供所需方法的对象,而不需要迫使它成为一个子类.
由于python属于动态语言,当你定义了一个基类和基类中的方法,并编写几个继承该基类的子类时,由于python在定义变量时不指定变量的类型,而是由解释器根据变量内容推断变量类型的(也就是说变量的类型取决于所关联的对象),这就使得python的多态不像是c++或java中那样,定义一个基类类型变量而隐藏了具体子类的细节。

鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。

class AudioFile:
    def __init__(self, filename):
        if not filename.endswith(self.ext):
            raise Exception("Invalid file format")
        self.filename = filename

class MP3File(AudioFile):
    ext = "mp3"
    def play(self):
        print("Playing {} as mp3".format(self.filename))

class WavFile(AudioFile):
    ext = "wav"
    def play(self):
        print("Playing {} as wav".format(self.filename))

class OggFile(AudioFile):
    ext = "ogg"
    def play(self):
        print("Playing {} as ogg".format(self.filename))

class FlacFile:
    """
    Though FlacFile class doesn't inherit AudioFile class,
    it also has the same interface as three subclass of AudioFile.

    It is called duck typing.
    """
    def __init__(self, filename):
        if not filename.endswith(".flac"):
            raise Exception("Invalid file format")
        self.filename = filename

    def play(self):
        print("Playing {} as flac".format(self.filename))

相关文章

  • 1_5_多态与duck typing

    多态:同一种事物的多种形态多态性:一种调用方式,不同的执行效果 1. 多态 同一操作作用于不同的对象,可以有不同的...

  • python常用的一些技巧

    1、三目操作符 2、鸭子类型(duck typing) 首先Python不支持多态,也不用支持多态,python是...

  • what is "duck typing"???

    Duck typing in computer programming is an application of ...

  • C++泛型与多态(4): Duck Typing

    对于一门强类型的静态语言来说,要想通过运行时多态来隔离变化,多个实现类就必须属于同一类型体系。也就是说,它们必须通...

  • Python Duck typing

    详见 什么是鸭子类型(duck typing)

  • Duck Type 鸭子类型

    Duck Typing is a [type system] used in dynamic languages....

  • go笔记

    0.关键词:ok parttern ,type switch, duck typing, structural...

  • Typescript

    安装 Typescript 接口 interface 约束类型结构、Duck Typing 类型推论、联合类型、类...

  • Typescript --- 基础入门

    Typescript 给 JavaScript 带来了强大的类型系统 类型语言: duck typing 所谓看起...

  • Day15 心得体会&读书笔记

    一、心得体会1、今天完成了什么? 看了Ruby核心、Duck typing、类与对象、RUby安全 看10个con...

网友评论

      本文标题:1_5_多态与duck typing

      本文链接:https://www.haomeiwen.com/subject/rbsgsftx.html