对python装饰器的理解

Python装饰器用于代码重用,提供切面功能如日志、事务处理等。它们通过@符号实现,@后面通常接一个返回函数的高阶函数。@符号的使用包括接不返回函数的函数,例如@property用于修饰类属性,使代码更优雅。
摘要由CSDN通过智能技术生成

对python装饰器的理解

其出发点仍然是代码重用。所谓装饰就是在一般事物(函数)的外围加上一些并不属于这个事物核心的东西。因此装饰器所执行的内容并不属于所修饰函数的核心内容。相反,其一般用于提供切面功能,如:插入日志、事务处理、缓存、权限校验等等。因为这类功能可以归纳到一个函数中,装饰器的存在将使得实现切面功能只需添加一两行代码即可。decorator实质上就是一个返回函数的高阶函数。

装饰器使用@符号实现,后面接一个返回函数的函数:

# source from: https://www.liaoxuefeng.com/
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def printNow():
	print(time.strftime("%Y/%m/%d/ %H:%M:%S",time.localtime()))

经过@log修饰的函数,被调用时,相当于执行:

log(printNow)()

@符号的使用

这里我们还可以探讨一下@符号的使用:

  • @符号后面接了不返回函数的函数
  • 使用@property 修饰函数
@符号后面接了不返回函数的函数
def funcA(A):
    print("function A")
    print(A)
 
def funcB(B):
    print(B(2))
    print("function B")
 
@funcA
@funcB
def func(c):
    print("function C")
    return c**2

这段代码的是执行结果是:

function C
4
function B
function A
None

那到底是怎么个执行顺序呢?实际上执行的语句相当于:

funcA(funcB(func))

这里先执行 funcB(func),因此首先执行了func(2),然后打印了它返回的结果4,接着打印function B。然后funcB执行完毕,但没有返回值,因此此时funcA的参数 ANone,所以继而执行了funcA()。那为什么这里我们并没有调用func(),只是定义了func,而它却被执行了呢?这是我目前仍有疑问的,欢迎大佬们赐教。

使用@property 修饰函数

这个用法倒是很常见,可以将类属性的getset方法写成更优雅的形式

class Shape(Object):
	def __init__():
		self._name = 'wsmz'
	
	@property
	def name():
		return self._name
	
	@name.setter
	def name(nm):				# 注意:这里函数的名字必须和被声明成property的函数的名字一样
		self._name = nm

s = Shape()
print(s.name)
s.name = 'whsmz'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值