python代码,装饰器如何作用到class类上?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
还是继续讨论python
装饰器的用法,在前几篇文章中,苏南大叔对python
的装饰器的写法做了一些分析。但是,主要的写法还是函数类似的写法。那么,python
装饰器可以在类中使用么?装饰器如何对类作用?这就是本文中要重点讨论的问题。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文展示装饰器功能和类之间的功能联系。本文测试环境:win10
,python@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("韩语")
这个作用于类的方法上面的装饰器用法,非常好理解。不用过多解释。
装饰器也可以作用于类
装饰器也可以作用于类上,不过写法和作用于函数的时候,差别较大。装饰器的逻辑修改的效果,实际上作用于类的__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
。(意思是没地方写后置逻辑)
如果检测被装饰的类的__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())
相关文章
- https://newsn.net/say/python-decorators.html
- https://newsn.net/say/python-decorators-2.html
- https://newsn.net/say/python-decorators-3.html
综述
本文是python
装饰器系列文章中的一篇文章,主要致力于说明装饰器和类的关系。更多python
经验文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。