首页 > 其他分享 >装饰器的多种实现方式(二)

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

时间:2023-05-15 15:33:44浏览次数:66  
标签:__ 多种 方式 get self instance Valley 装饰 def

基于类实现装饰器变体

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

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

 

标签:__,多种,方式,get,self,instance,Valley,装饰,def
From: https://www.cnblogs.com/shixiaogu/p/17402041.html

相关文章

  • C#异步有多少种实现方式?
    思维导航前言.NET异步编程模式C#异步有四种实现方式参考文章前言微信群里的一个提问引发的这个问题,有同学问:C#异步有多少种实现方式?想要知道C#异步有多少种实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式。.NET异步编程......
  • eclipse插件WindowBuilder安装方式
    用在线安装,先启动eclipse,点菜单栏里帮助,再点里面的INSTALLNEWSOFTWARE,http://code.google.com/intl/zh-CN/javadevtools/download-wbpro.html 这网址里有3个版本,看你的是什么版本,直接把网址复制到WORKWITH里面去,等一下在下面的框里就会出现WINDOWBUILDER,全选,然后下一步···......
  • Redis 持久化方式
    参考:小林coding https://xiaolincoding.com/redis/storage/aof.html#aof-%E9%87%8D%E5%86%99%E6%9C%BA%E5%88%B6https://www.cnblogs.com/lovezhr/p/15886823.html AOF(AppendOnlyFile)如果Redis 每执行一条写操作(不会记录读操作命令)命令,就把该命令 以追加的方式写入到......
  • 关于 UE4 TMap 的几种遍历方式
    测试数据1TMap<int32,FString>Map1;2TMap<int32,FString>Map2;34Map1.Add(1,TEXT("AAA"));56ShowMap_1(Map1,1);7ShowMap_2(Map1,1);8ShowMap_3(Map1,1);  1. 通过Key直接查找Map1//通过Key直接查......
  • 装饰器
    装饰器(Decorator)的作用是可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。装饰器有很多种,有函数的装饰器,也有类的装饰器。体现设计模式中的装饰模式,强调开放封闭原则(已经实现的功能代码内部不允许被修改,但外部可以被扩展)最基本的结......
  • 关于 UE4 TMap 的几种遍历方式
    测试数据1TMap<int32,FString>Map1;2TMap<int32,FString>Map2;34Map1.Add(1,TEXT("AAA"));56ShowMap_1(Map1,1);7ShowMap_2(Map1,1);8ShowMap_3(Map1,1);  1. 通过Key直接查找Map1//通过Key直接查......
  • idea常见debug方式
    行断点方法断点方法断点,在方法上加一个断点,在进入方法的时候默认会在首行代码加一个断点并进入,在方法开始和方法结束的时候都会进行一个停顿,好处是方便观看结果的返回值。详细断点异常断点字段断点......
  • vector传递内存参数的三种方式
    vector作为参数的三种传参方式c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):function1(std::vector<std::vector<int>>vec),传值function2(std::vector<std::vector<int>>&vec),传引用function3(std::vector<std::vector<int>>*ve......
  • MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式
    MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式关键词:综合能源分布式协同优化交替方向乘子法最优潮流参考文档:《基于串行和并行ADMM算法的电_气能量流分布式协同优化_瞿小斌》仿真平台:MATLAB主要内容:本代码是较为全面的ADMM算法代码,实现了三种ADMM迭代方式,分别是:1、普通常......
  • Python代码:微网-预测+调度(多种预测算法以及强化学习调度算法)
    Python代码:微网-预测+调度(多种预测算法以及强化学习调度算法)关键词:光伏/负荷预测强化学习LSTM优化调度微网模型预测控制参考文档:《EnergyManagement和EconomicEvaluationofGrid-ConnectedMicrogridOperation》复现仿真平台:Python主要内容:该项目的目标是探索并网微......