欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-01 20:20:16
...

 

 

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() #正常

 

相关标签: 装饰器