Python装饰器

一个程序的代码避免不了地要修修改改,如下面函数:

def add(x , y):
   print(x + y)

现在我们想要在此基础上添加一个“输出x*y”的功能,那么你可能会这样做:

def add(x , y):
	print(x + y)
	print(x * y)#添加的代码

然后新的问题产生了,以下函数都想要添加“输出x*y”的功能,那该怎么做:

def add(x , y):
	print(x + y)
def sub(x , y):
	print(x - y)
def dev(x , y):
	print(x / y)

最直接的做法,就是给每个函数都加上一句“print(x*y)”,但这样就显得很冗杂,而且这样做违反了“开放-封闭”原则(Open Closed Principle,“开放”—允许现有功能进行扩展,“封闭”—禁止已实现代码进行修改)。

既然不允许我们修改原函数,那我们定义一个新的函数,在它里面调用原函数,并且添加新功能,然后返回这个拥有新功能的函数,覆盖原函数。那不就行了吗?代码如下:

def add(x , y):
	print(x + y)

def add_and_mul():
	def aam(x , y):#新建一个函数
		add(x , y)#把原函数功能搬过来
		print(x * y)#添加新功能
	return aam
	
add=new add_and_mul()#覆盖原函数

这样我们就实现了在不修改原函数add的情况下,为它添加新功能了,但到这里我们只是帮add函数实现了添加新功能,可是我们需要的是很多函数都添加乘法这个功能,那怎么办呢。这里就需要我们把上面的代码动态化一下,把add函数改成一个可变的参数,代入到 add_and_mul()里,具体做法如下:

def add(x , y):
	print(x + y)
	
def sub(x , y):
	print(x - y)
	
def dev(x , y):
	print(x / y)
	
def other_and_mul(f):#
	def aam(x , y):
		f(x , y)
		print(x * y)
	return aam
	
add=new other_and_mul(add)
sub=new other_and_mul(sub)
dev=new other_and_mul(dev)

其实到了这里,我们的工作就算已经完成了,但为了使代码更加简洁易懂,我们将
原函数名=new other_and_mul(原函数名)
改写成 @other_and_mul 并放到需要添加功能的函数前面。像这样

def other_and_mul(f):#要把声明好的装饰器放在前面,后面的函数才能使用
	def aam(x , y):
		f(x , y)
		print(x * y)
	return aam
	
@other_and_mul
def add(x , y):
	print(x + y)
	
@other_and_mul
def sub(x , y):
	print(x - y)
	
@other_and_mul
def dev(x , y):
	print(x / y)

这份代码于上一份代码的效果是完全一样的。不过这里我们将 @other_and_mul 叫做装饰器。

这就是Python装饰器的基础实现了,更深层次地,我们可以将装饰器 other_and_mul 内嵌在另一个函数内,利用外层函数设计其它功能,这样做的化装饰器的名字当然也就变成外层函数的函数名了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值