python,从多态和新式类的角度,谈鸭子类型

1.多态

  什么是多态?

  一个类表现出来的多种状态:通过继承来实现

  在python中的表现:

    函数的参数不需要指定数据类型,所以我们不需要通过继承的形式来统一一组类的类型,

    换句话说,在新式类中所有的对象其实都是object类型,所以在python中处处都是多态.

  在java中的表现:

    在一个函数中需要给参数指定数据类型(参数的数据类型必须是固定的),如果这个地方可以接收两个以上类型的参数

    那么这些类型应该有一个父类,这个父类是所有子类对象的类型.

    因此java运用多态来解决函数参数数据类型的规范问题

# 在 java 中:
class Payment:pass
class ApplePay(Payment):
    def pay(self,money):
        print('付了%s元'%money)
class Alipay(Payment):
    def pay(self,money):pass
#
app1 = ApplePay()
app2 = Alipay()
def pay(obj,money):  # obj的数据类型统一继承父类都是Payment类型
    obj.pay(money)
pay(app1,123) # 函数对参数app1的调用
pay(app2,123) # 函数对参数app2的调用 

# app1 和 app2 子类中分别属于两种不同数据类型,但它们有共同的父类

2.新式类

  pycharm3以后的版本定义的类都是新式类,

  新式类的属性:在3.x的版本里,定义的任何一个类都是object的子类

#来验证一下新式类的这个属性对不对:
#任意定义两个类:
class Foo():
    pass

class Soo(Foo):
    pass

print(issubclass(Foo,object)) # True
print(issubclass(Soo,object)) # True

 3.从多态和新式类的角度谈鸭子类型

  3.1为什么python中函数的参数不需要限定数据类型?

            上文提到一切新式类都是object的子类,所以一切新式类的类型都继承了父类的类型,即object,简而言之,python中可以看成只有一种数据类型即object类型,所以传参数时,也就无所谓参数的数据          类型了,因为大家都是object类型.

  3.2什么是鸭子类型?

    上文提到python中函数传参不受数据类型的限制.但是,在内置函数中不是所有的参数都可以往里面传的,比如说len(),就不可以接收int数据类型,这就和上面pythoy设定的理论相冲突了,为了解决                这个问题,所以python引入了鸭子类型的概念,即向内置函数中传参数,不是通过继承实现多态而是通过一个模糊的概念来判断这个函数能不能接收这个类型的参数.

 

猜你喜欢

转载自www.cnblogs.com/jiandanxie/p/9573760.html
今日推荐