首页
学习
活动
专区
圈层
工具
发布

Python 装饰器装饰类中的方法

目前在中文网上能搜索到的绝大部分关于装饰器的教程,都在讲如何装饰一个普通的函数。本文介绍如何使用Python的装饰器装饰一个类的方法,同时在装饰器函数中调用类里面的其他方法。...使用装饰器来解决这个问题,装饰器函数应该写在类里面还是类外面呢?答案是,写在类外面。那么既然写在类外面,如何调用这个类的其他方法呢?...首先写出一个最常见的处理异常的装饰器: def catch_exception(origin_func): def wrapper(*args, **kwargs): try:...只需要修改装饰器定义的部分,使用装饰器的地方完全不需要做修改。 下图为正常运行时的运行结果: ? 下图为发生异常以后捕获并处理异常: ?...通过添加一个self参数,类外面的装饰器就可以直接使用类里面的各种方法,也可以直接使用类的属性。

1.9K20

类的封装,类内的方法装饰器,类的方法修改与删除装饰器,经典类和新式类

1.类的封装 封装:隐藏属性或方法,外部无法使用,内部可以使用,在类定义阶段就执行了,真的想引用,就使用_类名__属性名 #比如 class YwY: __name = 1 #其等同于做了这一层处理...__two() a = YwY() a.func() 2.类的方法修改与删除装饰器 1....@方法名.setter/@方法名.price.deleter # @方法名.setter:被 @方法名.setter 装饰的函数装饰函数名字必须和方法名字相同,方法名修改,会执行这个装饰的函数, #coding...3.类的方法绑定 # 对象的绑定方法:没有加任何装饰的方法就是对象的绑定方法 # 类的绑定方法:加了@classmethod装饰器的方法就是类的绑定方法,里面的形参必须是cls而不是self,约定俗称...# 非绑定方法:加了@staticmethod装饰器的方法就是非绑定方法,其实就是一个普通的函数,里面的self没有意义 4.经典类和新式类 1.定义 在python2中,如果明确写了继承object,

1.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python进阶——类装饰器的使用

    类装饰器的介绍 装饰器还有一种特殊的用法就是类装饰器,就是通过定义一个类来装饰函数。...类装饰器示例代码: class Check(object): def __init__(self, fn): # 初始化操作在此完成 self....要想类的实例对象能够像函数一样调用,需要在类里面使用call方法,把类的实例变成可调用对象(callable),也就是说可以像调用函数一样进行调用。...在call方法里进行对fn函数的装饰,可以添加额外的功能。 执行结果: 请先登陆... 发表评论 2....小结 想要让类的实例对象能够像函数一样进行调用,需要在类里面使用call方法,把类的实例变成可调用对象(callable) 类装饰器装饰函数功能在call方法里面进行添加

    29.8K105

    python装饰器的使用方法

    保存原函数信息 在使用装饰器时,调用的原方法已经被替换为装饰器返回的新方法了,所以方法的元信息已经被替换了, 通过 name、doc 得到的元数据已经被替换成了新方法的。...ERROR:root:add add 3 ---------- add2 3 # 1.7 在类上添加装饰器 上面都是使用装饰器来增强函数的功能,但它还可以增强类的功能,对类进行装饰。...get name = num 1 # 1.8 类装饰器 之前都是使用函数方法来定义装饰器,但其实也可以通过类来定义装饰器。...当我们调用 say 函数时,其实调用的是类装饰器的对象,这个时候会调用__call__方法,该方法中可以对原函数进行增强,并进行调用原方法。...say doc # 1.10 带参数的类装饰器 那么带参数的类装饰器该如何实现呢?

    63610

    python装饰器2:类装饰器

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器。 "类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。...你如何认为取决于你,两种说法都有出现在其它的文章中。我的文章中是将"类装饰器"解读为第一种方式,即装饰类的东西。...而“类作为装饰器装饰其它东西”,我都会为其标注"类作为装饰器"或"作为装饰器的类"以避免歧义。 类装饰器的形式 函数装饰器是装饰函数(方法)的,类装饰器是装饰类的,它们的表现形式是一样的。...由于返回的是class wrapper,那么它装饰类的时候,假设所装饰的类有构造方法__init__,构造方法中有属性,这个类中还有方法。...但类装饰器最终的目标是为了扩展类cls,所以在wrapper里必须得构造出cls的对象。上面采取的方式是通过cls()来构造cls对象,并放在wrapper对象的一个属性wrapped中。

    1.5K20

    类装饰器

    在理解类装饰器之前,先回忆一下有关装饰器的知识。装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的引用)。...__call__方法: zhangsan 类装饰器   类装饰器本质上和函数装饰器原理、作用相同,都是为其它函数增加额外的功能。...使用类装饰器可以直接依靠类内部的__call__方法来实现,当使用 @ 形式将类装饰器附加到函数上时,就会调用类装饰器的__call__方法。...而不需要向函数装饰器那样,在装饰器函数中定义嵌套函数,来实现装饰功能。   使用类装饰器为一个函数的执行增加计时功能。...相当于bar = Foo(bar),等号左边的bar是类Foo的实例对象,等号右边的bar是类装饰器所装饰的函数名bar作为参数传递给类Foo。

    81030

    python类的装饰器

    我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能。同理,一切皆对象,我们也可以使用装饰器为类添加类属性。...__dict__)上述的代码为Foo属性字典添加了x和y属性,但如果想添加'name' = 'harden'呢,这需要更灵活的定义了。...,@deco(name='curry')class Bar: passname属性也可以添加进去import tensorflow as tf再来个升级版,利用数据描述符和类的装饰器为类属性限定数据类型...我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能。同理,一切皆对象,我们也可以使用装饰器为类添加类属性。...,@deco(name='curry')class Bar: passname属性也可以添加进去再来个升级版,利用数据描述符和类的装饰器为类属性限定数据类型#数据描述符,代理另一个新式类的属性class

    95220

    Python教程| 如何使用装饰器

    这篇文章从以下角度尝试解析Python装饰器: 装饰器概念 理解装饰器所需的函数基础 装饰器使用场景 使用装饰器需要注意的地方 装饰器的缺点 装饰器概念 Python从2.4版本引入了装饰器的概念,所谓装饰器...适当使用装饰器能够有效提高代码可读性和可维护性。装饰器本质上就是一个函数,这个函数接收被装饰的函数 作为参数,最后返回一个被修改后的函数作为原函数的替换。...装饰器使用场景 注入参数(提供默认参数,生成参数) 记录函数行为(日志、缓存、计时什么的) 预处理/后处理(配置上下文什么的) 修改调用时的上下文(线程异步或者并行,类方法) 查看函数执行时间 import...这个问题的解决方法是 使用标准库 functools模块中的 wraps装饰器。这个装饰器的作用是复制函数属性到被装饰的函数。...这就存在一个问题,从Python的语法中讲,用户使用位置参数或者关键字参数都是合法的,如何才能正确判断用户是否具有相应的权限呢? 这个问题是由于我们无法控制用户使用位置参数还是关键字参数。

    85800

    Python基础语法-函数-函数装饰器-类装饰器

    类装饰器除了函数装饰器之外,Python还允许我们使用类装饰器来装饰函数。类装饰器是一个类,它接受一个函数作为参数并返回一个包装器函数。...例如,下面是一个使用类装饰器的示例:class DecoratorClass: def __init__(self, func): self.func = func def _...say_hello()在这个例子中,我们定义了一个名为“DecoratorClass”的类装饰器。这个类接受一个函数作为参数,并在实例化时将其保存在“self.func”属性中。...然后,我们定义了一个名为“call”的特殊方法,它将在实例被调用时执行,并且可以让实例像函数一样被调用。...最后,我们调用“say_hello”函数,它将在执行前和执行后打印两条消息,分别是装饰器类的前置和后置消息,以及我们原始函数的输出。

    76031
    领券