系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]

这篇具有很好参考价值的文章主要介绍了系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分类目录:《系统学习Python》总目录


函数装饰器是如此有用,以至于Python2.X和Python3.X都扩展了这一模式,允许装饰器应用于类和函数。简而言之,类装饰器类似于函数装饰器,但它们是在一条class语句的末尾运行,并把一个类名重新绑定到一个可调用对象。同样,它们可以用来在类一创建后就管理它们,或者当随后创建实例的时候插人一层包装逻辑来管理实例。代码结构如下:

def decorator(aClass):
    pass

@decorator
class C:
    pass

被映射为下列等价代码:

def decorator(aClass):
    pass

class C:
    pass

C = decorator(C)

类装饰器也可以扩展类自身,或者返回一个拦截了随后的实例创建调用的代理对象。例如,在文章《系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[实例:用类方法计数]》的示例中,我们可以使用这个钩子来自动地扩展需要实例计数器或任何其他所需数据的类:

def count(aClass):
    aClass.numInstances = 0
    return aClass

@count
class Spam:
    pass

@count
class Sub(Spam):
    pass

@count
class Other(Spam):
    pass

事实上,正如所编写的那样,该装饰器可被用于类或函数,我们可以在初始化对象属性之后,返回在这两种上下文中定义的对象:

def count(aClass):
    aClass.numInstances = 0
    return aClass

@count
def spam():
    pass

@count
class Sub:
    pass

@count
class Other:
    pass

print(spam.numInstances)
print(Other.numInstances)

输出:

0
0

尽管这个装饰器管理了一个函数或者类本身,正如我们将在后面的文章看到的,类装饰器也可以通过拦截构造函数,并将新的实例对象包在一个代理(这个代理会部署属性访问工具来拦截之后的属性访问请求)中,来管理一个实例的全部接口,下面是这个模型的简单版本:

def decorator(cls):
    class Proxy:
        def __inir__(self, *args):
            self.wrapper = cls(*args)
        def __getattr__(self, name):
            return getattr(self.wrapper, name)
        
    return Proxy

@decorator
class C:
    pass

X = C()

而元类是一种类似的基于类的高级工具,其用途往往与类装饰器有所重合。它们提供了一种备选的模型,能把一个类对象的创建路由到顶级type类的一个子类,在一条class语句的最后。为了获得对一个新的类对象创建或初始化的控制,一个元类通常重新定义type类的__new__或者__init__方法(这种做法通常用于拦截这两种方法之一)。最终效果就像类装饰器一样,定义了在类创建时自动运行的代码。在这里,这一步将类名绑定到一个用户定义元类的调用结果。事实上,一个元类完全可以不必是一个类。我们将探讨这种模糊了元类与装饰器之间区别的可能性,并且甚至比较这两种工具在许多不同场景中的功能上的等价性。

类装饰器和元类这两种方案都可以用来扩展一个类或返回一个任意的对象来替代它一一一这是一种几乎拥有无限的、基于类的定制化可能性的协议。我们后面会看到,元类也可以定义处理它们实例类的方法,而不是这些实例类的普通实例一一这是一种和类方法很相似的技术,而且可以用类装饰器代理中的方法和数据来模拟实现,或者甚至是一个返回一个元类实例的类装饰器。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.文章来源地址https://www.toymoban.com/news/detail-827106.html

到了这里,关于系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习笔记】Python核心技术与实战-基础篇-03列表和元组,到底用哪个?

    列表和元组,都是一个可以放置任意数据类型的有序集合。 在绝大多数编程语言中,集合的数据类型必须一致。不过,对于 Python 的列表和元组来 说,并无此要求: 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。 而元组是静态的,长度大小

    2024年02月08日
    浏览(38)
  • Python学习—装饰器的力量

    作为许多语言都存在的高级语法之一,装饰器是你必须掌握的知识点。 Python的装饰器(Decorator)允许你扩展和修改可调用对象(函数、方法和类)的行为,而无需永久修改可调用的对象本身。进一步解释就是装饰器(Decorator):从字面上理解,就是装饰对象的器件。可以在不

    2024年02月10日
    浏览(32)
  • 鸿蒙Harmony--状态管理器--@Provide装饰器和@Consume装饰器详解

    今天是1月11日号星期四,农历腊月初一,辞旧的岁月里,愿你守得云开、终见月明,迎新的时光中,愿你心御寒冬、顺遂无忧,岁末冬深,希望接下来的日子里足够幸运,攒足勇气、信心和运气,去迎接新的一年,去遇见更好的自己! 目录 一,定义 二,特性 三,装饰器说明

    2024年02月01日
    浏览(39)
  • 鸿蒙Harmony--状态管理器-@Observed装饰器和@ObjectLink装饰器详解

     经历的越多,越喜欢简单的生活,干净的东西,清楚的感觉,有结果的事,和说到做到的人。把圈子变小,把语放缓,把心放宽,用心做好手边的事儿,该有的总会有的! 目录 一,定义 二,装饰器说明 三,变量的传递/访问规则说明  四,使用 1,简单对象的使用 2,嵌套对

    2024年02月01日
    浏览(42)
  • HarmonyOS@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器。

    2024年01月18日
    浏览(27)
  • python 元类

    我们知道在python中一切皆对象,即使是类,也是对象,那么类这个对象是的类是谁呢?那就是 元类 。 通过 type() 和 obj.__class__ 可查看对象的元类: 从上面结果可以看出: 普通对象的元类可直接查看是创建对象的类 自己创建的一些类的元类是type python内置的一些基本类型的元

    2024年02月05日
    浏览(28)
  • 深入理解Python中的元类

    所有对象都是实例化或者调用类而得到的,Python中一切都是对象,通过class定义的类本质也是对象,对象又是通过调用类得到的,因此通过class定义的类肯定也是调用了一个类得到的,这个类就是元类。type就是Python内置的元类 在理解元类之前,你需要先掌握Pyt

    2024年02月08日
    浏览(32)
  • HarmonyOS—@Observed装饰器和@ObjectLink嵌套类对象属性变化

    概述 @ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步: 被@Observed装饰的类,可以被观察到属性的变化; 子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是

    2024年02月21日
    浏览(29)
  • 列表和元组(上)——“Python”

    各位CSDN的uu们你们好呀,今天小雅兰的内容是Python中的列表,下面,让我们进入列表的世界吧 列表是什么, 元组是什么 创建列表 访问下标 切片操作 遍历列表元素 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来 保存/表示数据 . 如果代码中需要表示的数据个数比较少

    2023年04月18日
    浏览(51)
  • python元类模型和class语句协议

    学习python的类型模型和class语句协议。class语句末尾自动调用type()创建类对象并且赋值给类名称。 python3.x中,用户定义的类对象是名为type的对象的实例,type本身是一个类; python2.x中,新式类继承object,它是type的一个子类;传统类是type的一个实例; type()内置函数返回任何对

    2024年01月21日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包