# !/usr/bin/env python
# -*- coding:utf-8 -*-
"""
类的约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:
1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的
2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)
"""
"""
类的约束:归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
方式一:
提取父类. 然后在父类中定义好方法. 在这个方法中什么都不用做. 就抛⼀个异常就可以了.
异常用来提醒程序员,子类都需要实现的方法。
这样所有的子类都必须重写这个方法. 否则. 访问的时候就会报错.
"""
class Payment:
def pay(self, money):
raise Exception('子类必须实现pay方法')
class Wechatpay(Payment):
def pay(self,money):
print(f'恭喜您,使用微信成功支付{money}元')
class Alipay(Payment):
def pay(self, money):
print(f'恭喜您,使用支付宝成功支付{money}元')
# 此类没有实现pay方法,实例化对象时会报错
class JDpay(Payment):
def jdpay(self, money):
print(f'恭喜您,使用京东成功支付{money}元')
p1_wechat = Wechatpay()
p1_wechat.pay(500)
p2_Alipya = Alipay()
p2_Alipya.pay(888)
p3_JDpay = JDpay()
p3_JDpay.pay(666) # 报错
"""
方法二:
使用元类来描述父类. 在元类中给出一个抽象方法.
这样子类就不得不给出抽象方法的具体实现. 也可以起到约束的效果.
"""
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
@abstractmethod # 父类装饰器装饰的方法,子类必须重写
def pay(self, money):
pass # 抽象方法
class Wechatpay(Payment):
def pay(self,money):
print(f'恭喜您,使用微信成功支付{money}元')
class Alipay(Payment):
def pay(self, money):
print(f'恭喜您,使用支付宝成功支付{money}元')
# 此类没有实现pay方法,实例化对象时会报错
class JDpay(Payment):
def jdpay(self, money):
print(f'恭喜您,使用京东成功支付{money}元')
# def pay(self, money):
# print(f'恭喜您,使用京东成功支付{money}元')
p1_wechat = Wechatpay()
p1_wechat.pay(500)
p2_Alipya = Alipay()
p2_Alipya.pay(888)
p3_JDpay = JDpay()
p3_JDpay.pay(666) # 报错
Python 类的约束
于 2022-03-01 11:47:39 首次发布