1.内置的 3 种函数装饰器
@staticmethod ——静态装饰器,返回函数的静态方法
当用此装饰器定义方法时,不会传递类或实例作为它的参数,这意味着可以在类中放置一个函数。静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层定义。
静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性
class C(object):
@staticmethod
def f(arg1, arg2, ...):
...
以上实例声明了静态方法 f,从而可以实现实例化使用 C().f(),当然也可以不实例化调用该方法 C.f()。
@classmethod ——类装饰器
当用此装饰器定义方法时,将类而不是类的实例作为第一个参数,这意味着可以在此方法中直接使用类的属性,而不是特定的实例的属性,因此不必进行硬编码。
class Singleton(object):
def __init__(self,myname):
self.name=myname
@staticmethod
def foo(a,b):
print('我是第{},他是第{}'.format(a,b))
print('我是第%d,他是第%d'%(a,b))
@classmethod
def foo_1(cls,a,b): #参数cls为Singleton(object)类对象
print('我是第%d,他是第%d' % (a, b))
print(cls('孙晓敏').name)
Singleton.foo(2,3)
Singleton.foo_1(3,4)
@property——把一个方法变成属性调用的,用于对属性值进行限定
参考文档:https://blog.csdn.net/qq_41359051/article/details/82939655
http://c.biancheng.net/view/4561.html
class Rect:
def __init__(self, area):
self.__area = area
@property #使用 @property 修饰了 area() 方法,area 属性将是一个只读属性。
def area(self):
return self.__area
@area.setter #修改 area 属性的值
def area(self,value):
self.__area=value
@area.deleter #使用 deleter 装饰器来删除指定属性
def area(self):
self.__area=0
rect = Rect(30)
# 直接通过方法名来访问 area 方法
print("矩形的面积是:", rect.area)
rect.area=50
print("矩形的面积是:", rect.area)
del rect.area
print("矩形的面积是:", rect.area)
2.自定义的函数装饰器 “@函数”
2.1不传递参数——一层函数,直接执行函数功能
def funA(fn):
print('A')
fn() # 执行传入的fn参数
return 'fkit'
'''
下面装饰效果相当于:funA(funB),
funB 将会替换(装饰)成 funA() 语句的返回值;
由于funA()函数返回 fkit,因此 funB 就是 fkit
'''
@funA #等价于funA(funB) funB被作为参数传递给funA
def funB():
print('B')
print(funB) 输出 A B Fkit
2.2带参数的函数装饰器——定义一个嵌套函数来传递参数
二层嵌套函数,第一层接收被装饰函数作为参数,第二层接收被装饰函数的参数作为参数
def foo(fn):
# 定义一个嵌套函数
def bar(*args,**kwargs):
fn(*args,**kwargs)
return bar
下面装饰效果相当于:foo(my_test),
my_test将会替换(装饰)成该语句的返回值;
由于foo()函数返回bar函数,因此my_test就是bar
同时,my_test 的参数 a 对应 bar 函数的参数 *args, b 对应 bar 函数的参数 **kwargs
@foo
def my_test(a):
print("==my_test函数==", a)
@foo
def new_test(a,b):
print("==new_test函数==",a," ",b)
my_test(10)
new_test(6, 5)
2.3带自定义参数的函数装饰器
三层嵌套函数,第一层接收装饰函数的参数,第二层接收被装饰函数作为参数,第三层接收被装饰函数的参数作为参数
def foo(num): #接收foo的参数
def my_decorator(fn): #接收被装饰函数作为参数
def bar(*args,**kwargs): #接收被装饰函数的参数
for i in range(num):
fn(*args,**kwargs)
return bar
return my_decorator
@foo(3)
def my_test(a):
print("==my_test函数==", a)
@foo(5)
def new_test(a,b):
print("==new_test函数==",a," ",b)
my_test(10)
new_test(6, 5)