[Python3] 如何装饰类中的类方法或静态方法

 

 

Talk is cheap

Code is here:

 

#普通装饰器(装饰函数和类)
def deco111(func_or_cls):

    def wrap(*args, **kwargs):
        print(type(func_or_cls))
        return func_or_cls(*args, **kwargs)
    return wrap


#装饰器中的self关键字使用(动态访问类中的其他方法/属性)
def deco222(func_or_cls):

    def wrap(self, *args, **kwargs): # self 关键字专门接收类或实例对象
        print(type(func_or_cls))
        if func_or_cls.__name__ == 'x4':
            if hasattr(self, 'x1'):
                self.x1()  #动态调用类中的方法
                print(self.a) #以及属性
                return func_or_cls(self, *args, **kwargs)

        return func_or_cls(self, *args, **kwargs)
    return wrap


class X:

    a = 666

    @classmethod
    @deco111
    def x1(self):
        print(333)

    @deco111
    @classmethod
    def x2(cls):
        print(123)

    @deco111
    @staticmethod  #如果要对静态方法和类方法进行装饰,
    # 要将@staticmethod或classmethod的帽子戴在最上面,装饰器的执行是从下到上的
    def x3(self):
        print(456)

    @classmethod
    @deco222  #使用第二个装饰器
    def x4(self):
        print(789)

X.x1() #正常
# X.x2() #异常 'classmethod' object is not callable
# X.x3() #异常 'staticmethod' object is not callable
X().x4() #正常

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值