py函数装饰器个人理解
最初见到装饰器是在类的方法中。
类的方法包括{实例方法,类方法,静态方法}
大多数为实例方法,而其中比较特殊的有类方法和静态方法。
方法 | 隐含调用参数 | 装饰器 | 默认参数 |
类方法 | 类 | @classmethod | cls |
静态方法 | 无 | @staticmethod | 无 |
注:类/静态方法可直接调用,无需初始化。
class Jing:
def __init__(self, x = 0):
self.x = x
@staticmethod
def static_method():
print("这是一个静态方法!")
@classmethod
def class_method(cls):
print("这是一个类方法!")
Jing.static_method()
Jing.class_method()
#直接调用
dm = Jing()
dm.static_method()
dm.class_method()
此时的输出为:
这是一个静态方法!
这是一个类方法!
这是一个静态方法!
这是一个类方法!
下面是关于一般函数装饰器的理解
首先定义一个函数funA,再定义一个函数funB,在AB之间加一个@funA
此时就可以说实用funA修饰了funB。
修饰过程:
1、将funB作为参数传给funA。
2、将funB替换成funA的返回值。
def funA(fn):
print('A')
fn()
return 'ssd'
@funA
def funB():
print('B')
print(funB)
此时的输出为:
A
B
ssd
这里要注意py中带括号返回的是该函数的返回值,不带括号的是该函数的位置信息。
这里传的是funB而不是funB()。
def outer(func):
def inner():
print('a')
func()
print('b')
return 'ssd'
return inner
@outer
def f1():
print('被装饰函数')
print(f1())
此时的输出为:
a
被装饰函数
b
ssd
这样可以更清晰的看到f1()被替换成了'ssd'。