装饰器的多种实现方式(二)

基于类实现装饰器变体

  在之前的文章里有提过基于类实现的装饰器,这里做一下延申

复制代码
import types
from functools import wraps


class Decorator:
    def __init__(self, func):
        wraps(func)(self)
        self.calls = 0

    def __call__(self, *args, **kwargs):
        self.calls += 1
        print("preparing")
        return self.__wrapped__(*args, **kwargs)

    def __get__(self, instance, owner):
        """确保绑定方法对象的创建"""
        if instance is None:
            return self
        return types.MethodType(self, instance)


class Valley:
    def __init__(self):
        ...

    @Decorator
    def get(self):
        print("running")


Valley().get()
print(Valley.get.calls)
复制代码

如果不实现__get__方法,实例方法会缺少调用方对象的传递,大家可以自行尝试

output:

  preparing
  running
  1

 

posted on   默玖  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示