''' 封装:将一些东西内容封装到一个地方,你还可以取出来。 类设置静态属性,设置一些方法 对象,对象可以在其对象空间中封装一些属性 多态:一个事物产生多种形态:气液固 python默认支持多态 ''' # # class A: # class_name = '23' # def __init__(self,name,age): # # self.name = name # self.age = age # # a1 = A('yz',21) # print(a1.name) # # a2 = A('yyc',24) # print(a2.age) #多态:python中定义变量不用规定变量类型 # a = 'yz' # a = [1,2,3] # a = (22,23) #鸭子类型 ''' python,你看起来像鸭子,那么你就是鸭子。 A,B互称为鸭子🦆 ''' # class A: # # def login(self): # pass # # def register(self): # pass # # class B: # def login(self): # pass # # def register(self): # pass #A,B虽然无关系但是很默契制定了一个规范,让你使用起来很方便。 #super class A: def f1(self): print('in A f1 ') def f2(self): print('in A f2') class foo(A): def f1(self): super().f2() print('in A foo') obj = foo() obj.f1() #super() 严格意义并不是执行父类的方法。 #单继承:super()肯定是执行父类方法 #多继承:super(S,self)严格按照self从属于的类的mro的执行顺序执行,S类的下一位 #print(Info.mro())
# class QQpay: # def pay(self,money): # print(f'利用qq支付类{money}') # # class Alipay: # def pay(self,money): # print(f'利用支付宝支付了{money}') # # #支付功能 # obj1 = QQpay() # obj1.pay(100) # # obj2 = Alipay() # obj2.pay(200) #版本2: # 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) # # obj2 = Alipay() # obj1 = QQpay() # pay(obj1,100) # pay(obj2,200) #第三版 # class QQpay: # def pay(self,money): # print(f'利用qq支付类{money}') # # class Alipay: # def pay(self,money): # print(f'利用支付宝支付了{money}') # # class Wechatpay: # def fuqian(self,money): # print(f'利用微信支付了{money}') # # #支付功能 # def pay(obj,money): #统一规划 # obj.pay(money) # # obj2 = Alipay() # obj1 = QQpay() # pay(obj1,100) # pay(obj2,200) # # obj3 = Wechatpay() # obj3.fuqian(300) #第四版:按照之前的代码改进 # class QQpay: # def pay(self,money): # print(f'利用qq支付类{money}') # # class Alipay: # def pay(self,money): # print(f'利用支付宝支付了{money}') # # class Wechatpay: # def pay(self,money): # print(f'利用微信支付了{money}') # # #支付功能 # def pay(obj,money): #统一规划 # obj.pay(money) # # obj2 = Alipay() # obj1 = QQpay() # pay(obj1,100) # pay(obj2,200) # # obj3 = Wechatpay() # pay(obj3,300) #在上边的情况下(在重要的逻辑与用户相关等核心部分),我们要建立约束,避免发生此类问题。 #类的约束有两种解决方式: #1。在父类建立一种约束 #2、模拟抽象类(制定一种规范)的概念,建立一种约束 #第一种:在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法 #即会报错。python 推荐的一种约束方式。 # class Payment: # def pay(self,money):#约定俗称定义一种规范,子类要定义pay方法 # raise Exception('子类必须定义pay方法') #主动抛出异常 # # 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 fuqian(self,money): # print(f'利用微信支付了{money}') # # #支付功能 # def pay(obj,money): #统一规划 # obj.pay(money) # # obj2 = Alipay() # obj1 = QQpay() # pay(obj1,100) # pay(obj2,200) # # raise Exception('代码格式错误') # obj3 = Wechatpay() # obj3.fuqian(400) # pay(obj3,300) #第二种: 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 fuqian(self,money): print(f'利用微信支付了{money}') # def pay(self,money): # pass # obj2 = Alipay() # obj1 = QQpay() # pay(obj1,100) # pay(obj2,200) obj3 = Wechatpay() # pay(obj3,300) # obj3.fuqian(400) #利用抽象类的概念,基类如上设置,子类没有定义pay方法,在实例对象就是报错