python中的鸭子类型

  1. python不支持多态也用不到多态,多态的概念是应用于java和C#这一类强类型语言中,而Python崇尚鸭子类型(Duck Typing)

  2. 鸭子类型:是一种动态类型的风格。一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James
    Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:
    “当看到一只鸟拥有油质(属性)绒毛,走路(方法)用脚,游泳(方法)用蹼,满足与鸭子同样的特征和行为,那么这只鸟就可以被称为鸭子。”

  3. 在鸭子类型中,关注的不是对象类型本身,而是它是如何使用的。我们可以编写一个函数,它接受一个类型为鸭子的对象,并调用它的走和游方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个(具有鸭子类型同样属性和方法的)任意类型对象,并调用它的走和游方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。

class F1: 
    pass

# 假设,S1是我们的正统类,它继承于根正苗红的F1,是我们的正统类 
class S1(F1):
    def show(self):
        print('S1.show') 

# S2是路人甲,是个歪瓜裂枣,但是他自己也有一个叫show的方法。 
class S2: 
    def show(self): 
        print('S2.show') 

# 在Java或C#中定义函数参数时,必须指定参数的类型,也即是说,我们如果用 
# Java写下面的Func,需要告知,obj是F1类还是其他什么东西。 
# 如果限定了F1,那么S2是不可以被采纳的。 
# 然而,在Python中,一切都是Obj,直接塞进去就可以
# 它不care你塞进去的到底是什么类,它最终只care这个类是否有调用所需的属性和方法

def Func(obj): 
    """Func函数需要接收一个F1类型或者F1子类的类型""" 
    obj.show() 
    
s1_obj = S1() 
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show 

s2_obj = S2() 
Func(s2_obj) # 在Func函数中传入S2类的对象 ss_obj,执行 S2 的show方法,结果:S2.show
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值