Baobao$

博客园 首页 新随笔 联系 订阅 管理

多态

python中处处是多态

python是一门自带多态的语言

 

java中的多态

强数据类型的语言

什么是多态:

一个类表现出来的多种状态

 支付Payment是一个类,多种状态: 使用阿里支付Alipay,使用微信支付Wechatpay
 支付表现出来的多种状态 :
     第一种状态 支付宝支付
     第二种状态 微信支付

 class Animal(object):pass
 class Cat(Animal):
     def eat(self):pass
 class Dog(Animal):
     def eat(self):pass
 def eat(Animal obj):
     obj.eat()
 小花 = Cat()  # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
 小黑 = Dog()
 eat(小花)
 eat(小黑)
 int str list tuple dict set 内置的数据类型
 Cat Dog Animal 自定义的类/数据类型
 动物吃表现出来的多种状态:
     猫吃
     狗吃

 python当中的多态

 class Alipay(object):
     def pay(self,money):
         pass
 class Wechatpay(object):
     def pay(self,money):
         pass
 def pay(person_obj,money):
     person_obj.pay(money)
 alex = Alipay()
 pay(alex,24.5)
 yuan = Wechatpay()
 print(yuan,23.5)
 pay('abc',23.5)

  

 python
 class Cat(object):
     def eat(self):pass
 class Dog(object):
     def eat(self):pass
 def eat(obj):
     obj.eat()
 小花 = Cat()  # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
 小黑 = Dog()
 eat(小花)
 eat(小黑)
 动物吃表现出来的多种状态:
     猫吃
     狗吃


在python中体现的多态:
           几个类拥有同名的方法,可以写一个函数,来统一进行调用 - 归一化设计
java要要求传递数据的数据类型? (通过继承来实现的)
          是为了代码不出错,只要你能够顺利的调用这个函数,那么内部的执行就大大降低出错的概率
python却不要求?
          更多的不是硬性的规定,但是可能会因为传递的参数不符合规则而使得代码报错,但是大大降低了代码繁琐程度

鸭子类型:

python特有的  鸭子类型是相对论

len()这个函数来说: str list dict set tuple 都是鸭子类型

      鸭子 == 数据集合

      对于len来说,它不关心给我的是一个具体的什么数据类型

      只关心 能够计算长度的就是我接受的参数

在java中 用多态实现的

def  len(object , obj):
        print("*" *20)
        return obj.__len()

print(len("abcd"))
print(len([1,2,3]))

在python中 用鸭子类型

       不关心这个对象的数据类型,只要这个对象含有一个__len__就可以了
    对于len函数来说,含有__len__的所有的类都是鸭子类型

def len(obj):
       print("*" *20)
       return obj.__len__()


print(len("abcd"))

print(len([1,2,3]))
 class Cat():
     def eat(self):pass
     def sleep(self):pass
     def drink(self):pass
     def play(self):pass
 class Dog():
     def eat(self):pass
     def sleep(self):pass
     def drink(self):pass
     def play(self):pass

 Cat和Dog就认为是鸭子类型
 绝对的像 : 狗有的猫都有

鸭子类型
    是python语言中特有的,不依赖于继承和规范来进行的一种约定(依赖继承和规范特指:java中的多态和接口)
    如果两个类都需要做某一件事 

中心思想 :

     不同类之间的相同的方法都应该用同一个名字 

抽象类 规范 : 不同类之间的相同的方法都应该用同一个名字

接口类 规范: 不同类之间的相同的方法都应该用同一个名字

归一化设计 :为了使用不同类中的方法,而要求 不同类之间的相同的方法都应该用同一个名字

class Cat():
    def eat(self):pass
class Dog():
    def eat(self):pass
def eat(obj):
    obj.eat()

  

多态  : 已经实现了"不同类之间的相同的方法都用同一个名字",解决不同类的对象的传参问题

 class Animal:pass
 class Cat(Animal):
     def eat(self):pass
 class Dog(Animal):
     def eat(self):pass
 def eat(Animal obj):
     obj.eat()

鸭子类型  : 不需要解决类的对象的传参问题,就可以直接利用已经实现的"不同类之间的相同的方法都用同一个名字"

class Cat:
    def eat(self):pass
class Dog:
    def eat(self):pass
def eat(obj):
    obj.eat()

  

posted on 2018-11-26 16:19  Baobao$  阅读(394)  评论(0编辑  收藏  举报