面向对象—多态、鸭子类型(Day21)
编程原则
java具有自己的编程原则和设计模式,不能多继承。
python的编程原则:
1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的)。
2.依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): # 创建一个规范,抽象类或接口类 metaclass指定的是一个元类 @abstractmethod def pay(self):pass # 加上装饰器pay变成抽象方法 class Alipay(Payment): def pay(self,money): print('使用支付宝支付了%s元' %money) class QQpay(Payment): def pay(self,money): print('使用QQ支付了%s元' %money) class Wechatpay(Payment): def fuqian(self,money): print('使用微信支付了%s元' %money) def pay(obj,money): obj.pay(money) w = Wechatpay() pay(w,100) #Can't instantiate abstract class Wechatpay with abstract methods pay
3.接口隔离原则:使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
接口
python中没有接口,接口的概念是Java里来的,因为Java没有多继承,接口可以实现多继承。
借口类的作用:
1.在Java中能够满足接口隔离原则,且完成多继承的约束。
2.在python中,满足借口隔离原则,由于python本身支持多继承,所以就不需要接口这个概念了。
归一化设计:不管是哪个类的对象,都调用同一个函数去完成相似的功能。
class Alipay(): def pay(self,money): print('使用支付宝支付了%s元' %money) class QQpay(): def pay(self,money): print('使用QQ支付了%s元' %money) def pay(obj,money):obj.pay(money) a = Alipay() pay(a,100) #用pay这个函数来调用
抽象类和接口类的区别:
1.在python中没什么不同,都是用来约束子类中的方法,只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现,
需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
2.在Java中抽象类的本质是一个类,必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么他只能被一个父类控制。
当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
编程语言分为:
1.强类型语言——Java c++ c# 必须在相同数据类型之间做运算。
2.弱类型语言——shell语言 不同数据类型之间可以运算 如:1+'1'。
3.结余强类型和弱类型之间的语言——python,动态强类型语言,相同数据类型之间做运算。
多态:
由于java语言必须做相同数据类型之间的运算,只能通过继承父类将多个数据类型作为参数传入
java中在一个类(父类)之下发展出来的多个类的对象都可以作为参数传入一个函数或者方法。
python 天生自带多态效果(继承object类)。
class Payment:pass #定义一个父类,下面的多个类都继承父类,数据类型继承父类的传入。 class QQpay(Payment): def pay(self,money): print('使用qq支付了%s元' % money) class Wechatpay(Payment): def pay(self,money): print('使用微信支付了%s元' % money) def recharge(self):pass def pay(Payment pay_obj,int money): pay_obj.pay(money) qq_obj = QQpay() qq_obj.pay(100) pay(qq_obj,100)
鸭子类型
python崇尚鸭子类型,即看起来像,叫起来像,走起路来像鸭子,那么它就是鸭子。不通过具体的继承关系来约束这些类中必须有哪些方法名,是通过一种约定成俗的概念来保证在多个类中相似的功能叫相同的名字。
class QQpay(): def pay(self,money): #看起来相同都叫pay print('使用qq支付了%s元' % money) class Wechatpay(): def pay(self,money): print('使用微信支付了%s元' % money) def pay(pay_obj,money): pay_obj.pay(money) qq_obj = QQpay() qq_obj.pay(100) pay(qq_obj,100)