@符号在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 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]]
@可以是数学运算符或DECORATOR,但您的意思是DECORATOR。
此代码:
def func(f):
return f
func(lambda :"HelloWorld")()
使用decorator可以写成:
def func(f):
return f
@func
def name():
return "Hello World"
name()
装饰器可以有参数。
你可以看到这个GeeksforGeeks帖子:https://www.geeksforgeeks.org/decorators-in-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
意识到这一点,我终于可以和弗拉斯克和平相处了。
行开头的@符号用于类和函数修饰符:
PEP 318:装饰Python装饰器
最常见的Python装饰器有:
@财产@分类法@静态方法
行中间的@可能是矩阵乘法:
@作为二进制运算符。
@符号还用于访问plydata/pandas数据帧查询pandas.dataframe.query中的变量。例子:
df = pandas.DataFrame({'foo': [1,2,15,17]})
y = 10
df >> query('foo > @y') # plydata
df.query('foo > @y') # pandas
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用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中获得所有直接子目录