作者:的发个地方 | 来源:互联网 | 2023-08-20 21:58
1.类的约束第一版:classWechatPay:defpay(self):print(微信支付)classAliPay:defpay(self):print(支付宝支付
1.类的约束
第一版:
class WechatPay:def pay(self):print("微信支付")class AliPay:def pay(self):print("支付宝支付")class QQpay:def fuqian(self):print("QQ支付")wei = WechatPay()
ali = AliPay()
qq = QQpay()wei.pay()
ali.pay()
qq.fuqian()
def pay(object):object().pay()
第二版:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class PayClass:def pay(self):passclass WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(QQpay)
(1)对类的约束有两种:
<1> 提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.
<2> 使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.
第三版:
class PayClass:def pay(self):raise Exception("你子类必须要写一个pay方法")class WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(QQpay)
from abc import ABCMeta,abstractmethod
class PayClass(metaclass&#61;ABCMeta): &#64;abstractmethoddef pay(self):raise Exception("你子类必须要写一个pay方法")class WechatPay(PayClass):def pay(self):print("微信支付")class AliPay(PayClass):def pay(self):print("支付宝支付")class QQpay(PayClass):def fuqian(self):print("QQ支付")def pay(object):object().pay()pay(WechatPay)
pay(AliPay)
pay(QQpay)
总结:
约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:
-
使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的
-
使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)
2.super 剖析
super是严格按照类的继承顺序执行
class A:def f1(self):print(&#39;in A&#39;)class Foo(A):def f1(self):super().f1()print(&#39;in Foo&#39;)class Bar(A):def f1(self):print(&#39;in Bar&#39;)class Info(Foo,Bar):def f1(self):super(Info,self).f1() print(&#39;in Info f1&#39;)aa &#61; Info()
aa.f1()a &#61; Foo()
b &#61; a
print(a)
print(b)print(Info.mro())
obj &#61; Info()
obj.f1()