@符号在Python中做什么?
当前回答
实例
class Pizza(object):
def __init__(self):
self.toppings = []
def __call__(self, topping):
# When using '@instance_of_pizza' before a function definition
# the function gets passed onto 'topping'.
self.toppings.append(topping())
def __repr__(self):
return str(self.toppings)
pizza = Pizza()
@pizza
def cheese():
return 'cheese'
@pizza
def sauce():
return 'sauce'
print pizza
# ['cheese', 'sauce']
这表明,在装饰器之后定义的函数/方法/类基本上只是作为参数传递给@符号之后的函数/函数。
第一次目击
微框架Flask从一开始就以以下格式介绍装饰器:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
这反过来又转化为:
rule = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
pass
意识到这一点,我终于可以和弗拉斯克和平相处了。
其他回答
用不同的方式来表达别人的想法:是的,这是一个装饰师。
在Python中,它类似于:
创建函数(在@call下面)调用另一个函数对创建的函数进行操作。这将返回一个新函数。您调用的函数是@的参数。用返回的新函数替换定义的函数。
这可以用于各种有用的事情,因为函数是对象,只是必要的指令。
实例
class Pizza(object):
def __init__(self):
self.toppings = []
def __call__(self, topping):
# When using '@instance_of_pizza' before a function definition
# the function gets passed onto 'topping'.
self.toppings.append(topping())
def __repr__(self):
return str(self.toppings)
pizza = Pizza()
@pizza
def cheese():
return 'cheese'
@pizza
def sauce():
return 'sauce'
print pizza
# ['cheese', 'sauce']
这表明,在装饰器之后定义的函数/方法/类基本上只是作为参数传递给@符号之后的函数/函数。
第一次目击
微框架Flask从一开始就以以下格式介绍装饰器:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
这反过来又转化为:
rule = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
pass
意识到这一点,我终于可以和弗拉斯克和平相处了。
行开头的@符号用于类和函数修饰符:
PEP 318:装饰Python装饰器
最常见的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笔记本中使用Numpy库的一些代码,则@operator表示矩阵乘法。例如:
import numpy as np
def forward(xi, W1, b1, W2, b2):
z1 = W1 @ xi + b1
a1 = sigma(z1)
z2 = W2 @ a1 + b2
return z2, a1
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录