Python高阶专题:鸭子类型与多态

  • Post author:
  • Post category:python




1. 鸭子类型

鸭子类型是动态语言的一种风格,Python作为一门动态语言也继承了这种风格,关于鸭子类型官方的解释:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子”,这种解释对于没有深入了解动态语言的程序员来说可能有些牵强,要了解鸭子类型,首先就要了解面向对象编程思想种一种非常重要的思想——

多态



2. 多态

面向对象编程的编程思想精髓:封装,继承,多态,对于封装以及继承在这里不做解释,这里以Java为例简单解释一下多态,在Java中是无法实现多继承,但是如果像实现多态就要使用到接口这个概念,不做过多解释。

在这里插入图片描述

在Python中一切皆对象的思想刻入了Python设计的设计理念中,Python中的对象可以作为值传递,返回,所以可以通过这种理念实现多态,鸭子类型就是多态的一种实现

class PagHandler() :
	def Shotter() :
		pass
class DogHandler() :
	def Shotter() :
		pass
class CatHandler() :
	def Shotter() :
		pass
AnimalSequence = [PagHandler,DogHandler,CatHandler]
for Animal in AnimalSequence :
	Animal().Shotter()


3. 鸭子类型通俗解释


子类对象不由其所继承的父类决定,而是由子类的方法决定

Python中的魔法函数就是鸭子类型的范例,比如我们实现一个序列类,我们不用继承实现序列的父类对象,而直接实现__getitem__方法即可。

class SequenceHandler :
    def __init__(self,sequence):
        self._sequence = sequence
    def __getitem__(self, item):
        return self._sequence[item]
class PagHandler :
	def Shotter() :
		return "I am a Pag"
class DogHandler:
	def Shotter() :
		return "I am a Dog"

class CatHandler:
	def Shotter() :
		return "I am an Human"
#对于CatHandler这个类,实例化之后调用类Shotter方法,并打印出了" I am an Human" 可以理解为Human 而不是 Cat



版权声明:本文为Mr_zhangbz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。