python constraint_python基础学习笔记——类的约束

⾸先, 你要清楚. 约束是对类的约束.

用一个例子说话:

公司让小明给他们的网站完善一个支付功能,小明写了两个类,如下:

class QQpay:

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay:

def pay(self,money):

print('使用阿里支付%s元' % money)

a = Alipay()

a.pay(100)

b = QQpay()

b.pay(200)

但是上面这样写不太放方便,也不合理,老大说让他整改,统一一下付款的方式,小明开始加班整理:

class QQpay:

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay:

def pay(self,money):

print('使用阿里支付%s元' % money)

def pay(obj,money): # 这个函数就是统一支付规则,这个叫做: 归一化设计。

obj.pay(money)

a = Alipay()

b = QQpay()

pay(a,100)

pay(b,200)

写了半年的接口,小明终于接了大项目了,结果公司没品位,招了一个野生的程序员春哥接替小明的工作,老大给春哥安排了任务,让他写一个微信支付的功能:

class QQpay:

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay:

def pay(self,money):

print('使用阿里支付%s元' % money)

class Wechatpay: # 野生程序员一般不会看别人怎么写,自己才是最好,结果......

def fuqian(self,money):

print('使用微信支付%s元' % money)

def pay(obj,money):

obj.pay(money)

a = Alipay()

b = QQpay()

pay(a,100)

pay(b,200)

c = Wechatpay()

c.fuqian(300)

结果春哥,受惩罚了,限期整改,那么春哥,发奋图强,看了太白教你学python的相关资料,重新梳理的代码:

class Payment:

""" 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。

"""

def pay(self,money):pass

class QQpay(Payment):

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay(Payment):

def pay(self,money):

print('使用阿里支付%s元' % money)

class Wechatpay(Payment):

def fuqian(self,money):

print('使用微信支付%s元' % money)

def pay(obj,money):

obj.pay(money)

a = Alipay()

b = QQpay()

pay(a,100)

pay(b,200)

c = Wechatpay()

c.fuqian(300)

但是,这样还会有问题,如果再来野生程序员,他不看其他的支付方式,也不知道为什么继承的类中要定义一个没有意义的方法,所以他会是会我行我素:

class Payment:

""" 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。

"""

def pay(self,money):pass

class QQpay(Payment):

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay(Payment):

def pay(self,money):

print('使用阿里支付%s元' % money)

class Wechatpay(Payment):

def fuqian(self,money):

print('使用微信支付%s元' % money)

def pay(obj,money):

obj.pay(money)

a = Alipay()

b = QQpay()

pay(a,100)

pay(b,200)

c = Wechatpay()

c.fuqian(300)

所以此时我们要用到对类的约束,对类的约束有两种:

1. 提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.

2. 使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果.

先用第一种方式解决:

class Payment:

"""

此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。

"""

def pay(self,money):

raise Exception("你没有实现pay方法")

class QQpay(Payment):

def pay(self,money):

print('使用qq支付%s元' % money)

class Alipay(Payment):

def pay(self,money):

print('使用阿里支付%s元' % money)

class Wechatpay(Payment):

def fuqian(self,money):

print('使用微信支付%s元' % money)

def pay(obj,money):

obj.pay(money)

a = Alipay()

b = QQpay()

c = Wechatpay()

pay(a,100)

pay(b,200)

pay(c,300)

第二种方式:引入抽象类的概念处理。

from abc import ABCMeta,abstractmethod

class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类

@abstractmethod

def pay(self):pass # 抽象方法

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 pay(self,money):

# print('使用微信支付了%s元'%money)

def recharge(self):pass

def pay(a,money):

a.pay(money)

a = Alipay()

a.pay(100)

pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能

q = QQpay()

q.pay(100)

pay(q,100)

w = Wechatpay()

pay(w,100) # 到用的时候才会报错

# 抽象类和接口类做的事情 :建立规范

# 制定一个类的metaclass是ABCMeta,

# 那么这个类就变成了一个抽象类(接口类)

# 这个类的主要功能就是建立一个规范

总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:

1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的

2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值