基于前面的使用函数作为装饰器的理解,将类作为装饰器时需要保证以下几点

类的实例是可调用的

类需要一个地方讲被装饰的函数传入到类的实例里

第一条可以通过__call__实现,第二条可以通过__init__实现。

手工将类作为装饰器使用

class Profiled:

def __init__(self, func):

# wraps(func)(self)

self.func = func

def __call__(self, *args, **kwargs):

print("call")

return self.func(*args, **kwargs)

def add(x, y):

return x + y

add = Profiled(add)

result = add(1, 2)

print(result)

执行结果:

call

3

似乎再用语法糖包装一下就可以实现将类作为装饰器来使用了。

使用类作为装饰器使用

from functools import wraps

class Profiled:

def __init__(self, func):

# wraps(func)(self)

self.func = func

def __call__(self, *args, **kwargs):

print("call")

return self.func(*args, **kwargs)

@Profiled

def add(x, y):

return x + y

result = add(1, 2)

print(result)

运行结果同上。

小结

这节我们以我们理解的方法实现了将类作为装饰器使用,看起来都很正确,似乎就是这样使用?但是这种方法还有一些别的问题,最重要的是同样的问题,可以在代码中使用:

print(add.__name__)

发现无法输出__name__,根据约定使用装饰器不能改变函数的__name__属性,因此我们还需要改进将类作为装饰器的使用方法。

python装饰器类-Python装饰器15-开始使用类作为装饰器相关推荐

  1. 面向对象类的使用(15)

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

  2. python装饰器类-Python 装饰器、类装饰器、属性装饰器

    今天来介绍一下python的装饰器. 1.首先来介绍一下简单的装饰器, def play(): return "i can play" if __name__ == '__main ...

  3. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  4. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  5. python装饰器类-Python类装饰器

    上次介绍了Python的函数装饰器,这次我们来讲一讲Python的类装饰器. Python的类装饰器基本语法如下: defdecorator(cls):print "6666666" ...

  6. python 类装饰器和继承_python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)...

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. 1 #coding= ...

  7. python类装饰器应用_python之描述符应用与类的装饰器

    一.描述符应用 1.1上下文管理协议 在上文中我们提到with语句中的上下文管理器.with语句可以如此简单但强大,主要依赖于上下文管理器.那么什么是上下文管理器?上下文管理器就是实现了上下文协议的类 ...

  8. python装饰器类-python装饰器2:类装饰器

    本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你如何认为取决于你,两种说法都有出现在其它的文章中.我的文章 ...

  9. python装饰器函数-Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

最新文章

  1. python tkinter 实现一个秒表 从0开始_Writeathon:从0开始实现的一个side project
  2. 嵌入式Linux USB驱动开发之教你一步步编写USB驱动程序
  3. Angular双向数据绑定原理
  4. OO_Unit2_多线程电梯
  5. Noip2016day1 天天爱跑步running
  6. ubuntu 10.10下面添加samba实现和windows共享文件
  7. 用C#实现软件自动更新思路
  8. MFC模态对话与非模态对话框(二)
  9. WebRTC学习资料大全
  10. 机器学习 Machine Learning- 吴恩达Andrew Ng 第11~15课总结
  11. SQL Server 2014 安装与SQL语言学习笔记(一)
  12. 测试驱动开发心得体会
  13. Quartz 定时器 定时任务
  14. vegas视频软件使用教程和笔记
  15. 连上hdmi后没有声音。
  16. MT4 DDE数据交换
  17. oracle 视图的写法,Oracle视图基础详解与实例
  18. vue 环境配置.env;.env.development;.env.production配置
  19. PHP通过推广二维码追溯统计用户来源
  20. iQOONeo6SE和红米k40区别 哪个好 iQOONeo6SE和红米k40哪个值得买 两者配置对比

热门文章

  1. 使用UIScrollView 实现分页功能
  2. UML和模式应用学习笔记-1(面向对象分析和设计)
  3. 关于delphi中的register, pascal, cdecl, stdcall, safecall
  4. [转] Windows系统Net命令使用技巧
  5. JDBC—01—JDBC简介;JDBC常用接口与类;
  6. select选择框实现跳转
  7. spring mvc拦截器和mvc:annotation-driven /的详解
  8. Windows Phone + VB 程序员=好的移动应用程序
  9. 【11/11】模拟赛
  10. docker 删除默认连接_Net Core 中 Docker应用