Python @函数装饰器及用法

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值