@符号在Python中做什么?
当前回答
Python装饰器就像函数或类的包装器。这还是太概念化了。
def function_decorator(func):
def wrapped_func():
# Do something before the function is executed
func()
# Do something after the function has been executed
return wrapped_func
上面的代码是装饰函数的装饰器的定义。function_decorator是装饰器的名称。
wrapped_func是内部函数的名称,实际上它只在这个decorator定义中使用。func是被修饰的函数。在内部函数wrapped_func中,我们可以在调用func之前和之后执行任何操作。在定义了decorator之后,我们只需按如下方式使用它。
@function_decorator
def func():
pass
然后,每当我们调用函数func时,我们在decorator中定义的行为也将被执行。
例子:
from functools import wraps
def mydecorator(f):
@wraps(f)
def wrapped(*args, **kwargs):
print "Before decorated function"
r = f(*args, **kwargs)
print "After decorated function"
return r
return wrapped
@mydecorator
def myfunc(myarg):
print "my function", myarg
return "return value"
r = myfunc('asdf')
print r
输出:
Before decorated function
my function asdf
After decorated function
return value
其他回答
从Python 3.5开始,“@”用作矩阵乘法的专用中缀符号(PEP 0465——请参见https://www.python.org/dev/peps/pep-0465/)
它表示您正在使用装饰器。这是布鲁斯·埃克尔2008年的例子。
Python装饰器就像函数或类的包装器。这还是太概念化了。
def function_decorator(func):
def wrapped_func():
# Do something before the function is executed
func()
# Do something after the function has been executed
return wrapped_func
上面的代码是装饰函数的装饰器的定义。function_decorator是装饰器的名称。
wrapped_func是内部函数的名称,实际上它只在这个decorator定义中使用。func是被修饰的函数。在内部函数wrapped_func中,我们可以在调用func之前和之后执行任何操作。在定义了decorator之后,我们只需按如下方式使用它。
@function_decorator
def func():
pass
然后,每当我们调用函数func时,我们在decorator中定义的行为也将被执行。
例子:
from functools import wraps
def mydecorator(f):
@wraps(f)
def wrapped(*args, **kwargs):
print "Before decorated function"
r = f(*args, **kwargs)
print "After decorated function"
return r
return wrapped
@mydecorator
def myfunc(myarg):
print "my function", myarg
return "return value"
r = myfunc('asdf')
print r
输出:
Before decorated function
my function asdf
After decorated function
return value
在Python 3.5中,可以将@重载为运算符。它被命名为__matmul__,因为它被设计用于矩阵乘法,但它可以是任何你想要的。详见PEP465。
这是矩阵乘法的简单实现。
class Mat(list):
def __matmul__(self, B):
A = self
return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B)))
for j in range(len(B[0])) ] for i in range(len(A))])
A = Mat([[1,3],[7,5]])
B = Mat([[6,8],[4,2]])
print(A @ B)
此代码产生:
[[18, 14], [62, 66]]
此代码段:
def decorator(func):
return func
@decorator
def some_func():
pass
相当于此代码:
def decorator(func):
return func
def some_func():
pass
some_func = decorator(some_func)
在装饰器的定义中,您可以添加一些通常不会由函数返回的修改后的内容。
推荐文章
- 使用散射数据集生成热图
- '<是什么?=' PHP中的意思?
- python:将脚本工作目录更改为脚本自己的目录
- 如何以编程方式获取python.exe位置?
- 如何跳过循环中的迭代?
- 使用Pandas为字符串列中的每个值添加字符串前缀
- ImportError:没有名为matplotlib.pyplot的模块
- 在python中遍历对象属性
- 如何在Python中使用方法重载?
- 在Python中提取文件路径(目录)的一部分
- 如何安装没有根访问权限的python模块?
- 尝试模拟datetime.date.today(),但不工作
- 将行添加到数组
- 如何在Python中直接获得字典键作为变量(而不是通过从值搜索)?
- Python:为什么functools。部分有必要吗?