最近在学习一个开源工程文件,作者在许多定义的类之前使用了@符号。所以比较好奇它的功能,了解之后,举例记录一下。
@语法对应的是装饰器(decorator),是 Python 中一个非常强大的功能,它允许你在不修改函数或类代码的前提下,给它们添加额外的功能。
比如下面的代码,在不改变Tokyo的类代码情况下,为类增加了一个“打招呼”功能。
def add_greeting(cls):
cls.greet = lambda self: print("Hello from",cls.__name__)
return cls
@add_greeting
class Tokyo():
pass
obj = Tokyo()
obj.greet()
运行上面的程序,输出的结果如下:
Hello from Tokyo
关于这个代码,由于本人基础一般,所以做几点解释:
1.lambda是用来创建匿名函数的一种方式。
lambda 参数列表: 表达式
- 参数列表:是传递给函数的参数,类似于普通函数的参数。
- 表达式:是函数体,
lambda
表达式只能包含一个表达式,计算结果就是返回值。
2.self是访问实例(对象)的属性和方法,在类的方法中是必须的参数,指向当前的实例对象。
3.cls 通常可以访问类的属性和方法,这是python命名的习惯。
装饰器的一个应用就是:在可扩展的深度学习框架中,写好一个注册函数,然后每定义一个损失函数或检测头等类,就可以调用注册函数进行注册。