Python中@符号的两种核心用法:装饰器与矩阵乘法详解
本文详细解析Python中@符号的两种主要用途:作为函数修饰符实现装饰器模式,以及在Python 3.5+中用于矩阵乘法运算。通过具体代码示例,深入讲解装饰器的执行顺序、多层嵌套处理逻辑,以及利用__matmul__方法自定义矩阵运算的实现方式,帮助开发者全面掌握@符号的高级应用。
Python中@符号的含义解析
在常规语境下,@符号常用于电子邮件地址,但在Python编程语言中,它承载着更为关键的功能。主要包含两种用法:一是作为修饰符(装饰器),二是表示矩阵乘法(尽管后者使用频率较低)。当用作修饰符时,它可以在模块或类的定义层面对函数进行包装处理。尽管矩阵乘法的应用场景相对有限,但它提供了一种简洁的运算方式。需要特别注意的是,这两种含义的有效范围均始于Python 3.5版本之后。
一、作为修饰符的使用
@符号用作函数修饰符时,主要用于在模块或类的定义层级对现有函数进行功能增强或包装;
该符号必须出现在函数定义语句的前一行,严禁与函数定义代码写在同一行;
一个修饰符本质上是一个函数,它接收被修饰的函数作为参数,并返回经过处理后的同名函数或其他可调用对象。如果修饰函数返回的不是一个可调用对象,程序将抛出错误。
#Example 1
def test(func):
print("a")
return func()
@test #从这里可以看出@test等价于 test(xxx())
def xxx():
print('Hello world!')
代码运行结果如下:
a Hello world!
从上述结果可以看出,程序首先执行test()函数内部的print(“a”)语句,随后通过return func()返回xxx()函数的执行结果。
那么,如果在函数定义前连续出现两个或更多的@修饰器,其处理顺序是怎样的?请参考以下示例:
#Example 2
def FA(fn):
def warp():
return "<a>"+fn()+"<a>"
return warp
def FB(fn):
def warp():
return "<b>"+fn()+"<b>"
return warp
@FA #相当于makebold(test1),也就是把当前函数作为入参传过去
def test1():
return "test1"
@FB
def test2():
return "test2"
@FA
@FB
def test3(): #函数和装饰器是倒着执行的,从下往上,从内而外,一层层执行
return "test3"
print(test1())
print(test2())
print(test3())
代码运行结果如下:
<a>test1<a> <b>test2<b> <a><b>test3<b><a>
分析上述结果可知,当函数前方存在两个及以上装饰器时,执行顺序是从下往上、从内而外进行的。具体而言,最内层的函数先执行,其返回值作为参数传入上一层的装饰器FA(),FA()返回的值再传入FB(),最终得到FB()返回的结果。
二、作为矩阵乘法符号
#Example 3
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]]
总结
至此,关于Python中@符号的实例详解已介绍完毕。如需了解更多关于Python @符号的内容,建议搜索本站过往文章或继续阅读后续相关文章。希望本文能为您提供帮助,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









