前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象-类装饰器

面向对象-类装饰器

作者头像
星哥玩云
发布2022-09-08 13:01:10
3110
发布2022-09-08 13:01:10
举报
文章被收录于专栏:开源部署

一、类装饰器

__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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、类装饰器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档