python面向对象类的约束和设计的统一化规范
.封装
- 定义:将一些东西内容封存到一个地方,你还可以再取出,
- 类设置静态属性,设置一些方法
- 对象可以在其对象空间中封装一些属性
2.多态
- 定义:一个事物的多种形态
- 就想a可以是一个字符串,可以是一个列表等等,不像Java中定义时必须声明变量类型
- Python默认支持多态
3.鸭子类型
-
Python中你看起来像鸭子,那么你就是鸭子
-
统一化规范
-
例子:支付统一使用同一个接口
# class QQpay: # def pay(self, money): # print(f'利用qq支付了{money}') # class Alipay: # def pay(self, money): # print(f'利用支付宝支付了{money}') # 支付功能 规划一下 # def pay(obj,money): # 归一化设计 # obj.pay(money) # obj1 = QQpay() # obj2 = Alipay() # pay(obj1,100) # pay(obj2,200)
-
4.约束
-
让具有同一功能的类拥有同一个基类,在基类中对子类进行提示性约束和强制性约束
-
提示性约束
-
class Payment: # def pay(self,money): # 约定俗称定义一种规范,子类要定义pay方法. # raise Exception('子类必须定义此方法') # class QQpay(Payment): # # def pay(self, money): # print(f'利用qq支付了{money}') # # # class Alipay(Payment): # # def pay(self, money): # print(f'利用支付宝支付了{money}') # # # class Wechatpay(Payment): # # def pay(self,money): # # print(f'利用微信支付了{money}') # # class Wechatpay(Payment): # def fuqian(self,money): # print(f'利用微信支付了{money}') # # 支付功能 规划一下 # def pay(obj,money,choice): # 归一化设计 # obj.pay(money) # choice = input('qq,weixin,zhifubao') # obj3 = Wechatpay() # pay(obj3,300) # obj3.fuqian(300) # # print(11) # raise TypeError('代码格式错误') # print(222) # 第一种约束: 在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法 # 即会报错. python推荐的一种约束方式.
-
-
强制性约束
-
from abc import ABCMeta,abstractmethod # class Payment(metaclass=ABCMeta): # # 抽象类 接口类 规范和约束 metaclass指定的是一个元类 # @abstractmethod # def pay(self, money): # pass # 抽象方法 # # # class QQpay(Payment): # # def pay(self, money): # print(f'利用qq支付了{money}') # # class Alipay(Payment): # def pay(self, money): # print(f'利用支付宝支付了{money}') # # # class Wechatpay(Payment): # # def pay(self,money): # # print(f'利用微信支付了{money}') # class Wechatpay(Payment): # def fuqian(self,money): # print(f'利用微信支付了{money}') # # # def pay(self,money): # # pass # obj3 = Wechatpay() # 利用抽象类的概念: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.
-
-
5.super的深入理解
-
# class A: # def f1(self): # print('in A') # class Foo(A): # def f1(self): # super(Foo,self).f1() # print('in Foo') # 2 # class Bar(A): # def f1(self): # print('in Bar') # 1 # class Info(Foo,Bar): # def f1(self): # super(Info,self).f1() # print('in Info f1') # 3 # obj = Info() # print(Info.mro()) # [Info, Foo, Bar, A] # obj.f1() # super() 严格意义并不是执行父类的方法. # 单继承: super() 肯定是执行父类的方法. # 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位. class A: def f1(self): print('in A') class Foo(A): def f1(self): super().f1() print('in Foo') class Bar(A): def f1(self): # self = obj print('in Bar') class Info(Foo,Bar): def f1(self): # self = obj super(Foo,self).f1() print('in Info f1') obj = Info() # [Info, Foo, Bar, A] obj.f1() # 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.