还是继续讨论python装饰器的用法,在前几篇文章中,苏南大叔对python的装饰器的写法做了一些分析。但是,主要的写法还是函数类似的写法。那么,python装饰器可以在类中使用么?装饰器如何对类作用?这就是本文中要重点讨论的问题。

苏南大叔:python代码,装饰器如何作用到class类上? - 装饰器作用于class类
python代码,装饰器如何作用到class类上?(图4-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文展示装饰器功能和类之间的功能联系。本文测试环境:win10python@3.6.8

装饰器作用于类的方法

from functools import wraps
def examination(func):
    @wraps(func)
    def anything(*args, **kwargs):
        print("准备参加考试")
        func(*args, **kwargs)
        print("通过了该考试")
    return anything
class me:
    @examination
    def exam(self,lang):
        print("考试中:"+lang)
me().exam("韩语")

这个作用于类的方法上面的装饰器用法,非常好理解。不用过多解释。

苏南大叔:python代码,装饰器如何作用到class类上? - 普通的装饰器
python代码,装饰器如何作用到class类上?(图4-2)

装饰器也可以作用于类

装饰器也可以作用于类上,不过写法和作用于函数的时候,差别较大。装饰器的逻辑修改的效果,实际上作用于类的__init__方法上。下面的是个代码例子:

def decorator(cls):
    '''doc fake'''
    print("类初始化之前")
    return cls # 这里必须return cls

@decorator
class Model(object):
    '''doc'''
    def __init__(self):
        print("类初始化中")

    def method(self):
        print("这是一个普通的类方法")

Model().method()

这个作用于类上面的装饰器,不用两个def。但是,必须实现:

  • 接收cls类参数
  • 写好逻辑前置逻辑后,需要return cls。(意思是没地方写后置逻辑)

苏南大叔:python代码,装饰器如何作用到class类上? - 作用于类
python代码,装饰器如何作用到class类上?(图4-3)

如果检测被装饰的类的__name____doc__的话,会发现没有任何变化。如果检测__code__的话,会发现报错没有这个属性。

print(Model.__name__)
print(Model.__doc__)
print(Model.__code__)

作用于类的装饰器特殊用法

下面的这个例子中,使用装饰器把一个类硬生生的改成了另外一个类,而且还悄无声息。仅仅用于大家加深理解。

class A(object):
    def __init__(self):
        print("A 初始化")

def decorator(cls):
    return A

@decorator
class M(object):
    def __init__(self):
        print("M 初始化")

print(M())

苏南大叔:python代码,装饰器如何作用到class类上? - 作用于类上的特例
python代码,装饰器如何作用到class类上?(图4-4)

相关文章

综述

本文是python装饰器系列文章中的一篇文章,主要致力于说明装饰器和类的关系。更多python经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。