关于Python中鸭子类型的理解

最近在学习Python语言,字面意思的语言,因为平常会接触一些Python的程序,经常想改却无从下手,半吊子的感觉真的很难受…所以决定用一段时间夯实一下语言基础,培养一下Python语感.
昨天看到了Python多态及抽象的这部分,看到一个新词 "鸭子类型 ".可能是我书选的不好,感觉不是特别理解,而且本来是Java用的更多一些,没什么Python基础.所以今天找了点时间查了一些资料大概明白了.

概念

首先要明白鸭子类型(duck typing)的含义

Duck typing in computer programming is an application of the duck test—“If it walks like a duck and it quacks like a duck, then it must be a duck”—to determine if an object can be used for a particular purpose. With normal typing, suitability is determined by an object’s type. In duck typing, an object’s suitability is determined by the presence of certain methods and properties, rather than the type of the object itself
——摘自Wiki Duck typing词条

很明显,根据Wiki的解释,所谓鸭子类型,就是不管对象属于哪个类,也不关声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行相应操作.

忽略对象的真正类型,转而关注对象有没有实现所需的方法,签名,

其实初看这些解释我也不是很明白,直到我找到了这个例子就明白所谓的鸭子类型是什么含义了

例子

# 终于看到了一个能让我理解鸭子类型的例子了

class Duck:
    def walk(self):
        print('The duck walks like a duck')

    def swim(self):
        print('The duck swims like a duck')


class Person:
    def walk(self):
        print('The person walks like a duck')

    def swim(self):
        print('The person swims like a duck')


def watch(animal):
    animal.walk()
    animal.swim()


d = Duck()
p = Person()

watch(d)
watch(p)

可以看到我定义了两个类,一个Duck,一个Person,两个类都实现了walk()swim()方法,在定义一个watch函数,在函数体内执行参数的walk()方法和swim()方法,并将两个类的实例对象作为参数调用watch()函数,均能正常执行

理解

我觉得这个例子很明显地解释了鸭子类型的意思,像我们写C或者Java时,定义一个函数的同时,要同时定义函数的返回值类型,参数类型等等,而Python则不需要,只要对象实现了需要被调用的方法,就是OK的,并不在乎到底是什么类型的对象.就像无论是 元组,数组,字符串等等均能调用extend方法是一个道理的.

所以其实理解之后发现这并不是什么新奇高深的东西,但也确实反映着Python语言的特点.
就这样~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值