Python (四): @ (at)修饰符的理解

@是什么

@是一个语法糖, 语法糖的意思是一种简便写法 (就好像 a++ 是 a = a + 1 的简便写法), 以下两种表达方式完全等价

def foo(fn):
	fn('hi')

# 写法一
@foo
def bar(something):
	print(something)

# 写法二
def bar(something):
	print(something)
bar = foo(bar)

所以@的作用是:

  1. 获得一个高级自定义函数
  2. 作为调用第三方函数的回调函数

下文对以上两点作解释.

理解

作为高级函数

以数据库场景为例, 我可以把数据库逻辑相关的函数提前写好

import pymysql

'''
	将数据库相关的逻辑提前写好
'''
def get_rows(callback):
	def _(*args):
		db = pymysql.connect('localhost', 'root', 'root', 'some_db')
		cursor = db.cursor()
		cursor.execute(args[0])
		rows = cursor.fetchall()
		db.close()
		return callback(rows=rows)
	return _

'''
	这里只需要写处理的逻辑
'''
@get_rows
def process_rows(sql=None, rows=None, fn = None):
	for row in rows:
		if fn is None:
			print(row)
		else:
			fn(row)

if __name__ == '__main__':
	process_rows(sql = 'select * from user')

作为回调函数

首先需要注意的是, @语法它相当于执行了

bar = foo(bar)

因此, 解释器在读到@命令以及其下方的函数定义之后, 会立即执行@的函数, 所以可以有如下用法:

def foo(callback):
    # 开启一个线程, 定时调用 callback
    # 以下语句无意义, 纯粹为了符合语法
    def _():
        pass
    return _ 

@foo
def bar():
	# do something...
    pass

这种用法的特点是, 你只需要声明这个 bar 函数, @语句会自动执行这个 foo 函数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值