面向对象-类装饰器

2022-09-08 13:01:10 浏览数 (1)

一、类装饰器

__call__

把对象当成函数后面加一对小括号执行时,会默认调用类中的__call__对象方法

代码语言:javascript复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span><span class="hljs-params">(object)</span>:</span>
    <span class="hljs-comment"># per()  ==>   per.__call__()</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__call__</span><span class="hljs-params">(self, *args, **kwargs)</span>:</span>
        print(<span class="hljs-string">"----------call"</span>)
per = Person()

per()

普通装饰器

代码语言:javascript复制
class AddXing(object):
    # 传入待加功能的函数
    def __init__(self, f):
        self.f = f
    # 传入原函数的需要参数
    def __call__(self, *args, **kwargs):
        #增加功能
        print("**************")
        res = self.f(*args, **kwargs)
        return res

带参装饰器

代码语言:javascript复制
class Count(object):
    # 带参数的装饰器的参数__init__这里传递
    def __init__(self, count=3):
        self.count = count
    # 接收待加功能的函数
    def __call__(self, f):
        # 传入原函数的需要参数
        def inner(*args, **kwargs):
            for i in range(self.count):
                f(*args, **kwargs)
        return inner

使用

代码语言:javascript复制
@Count()
def func(name, age):
    print("My name is %s!I am %d years old!"%(name, age))
    
func()

原理

代码语言:javascript复制
@AddXing
def func(name, age):
    pass

obj = AddXing(func)
func = obj
func() ==> obj()  ==> obj.__call__  ==> func.__call__()
代码语言:javascript复制
@Count(3)
def func(name, age):
    pass

obj = Count(3)
inner = obj(func)
func = inner

0 人点赞