多态
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()