python面向对象值元类的声明周期详解

 更新时间:2023年05月02日 08:40:23   作者:真的不能告诉你我的名字  
这篇文章主要介绍python的元类生命周期,我们可以和之前探讨类的生命中周期一样,我们写一个案例,使用print来输出一些信息,来判断如果基于元类而言,那么生命周期是怎么样的,文中有详细的代码示例,需要的朋友可以参考下

元类的生命周期

我们之前介绍过,关于类的生命周期,这里先简单回顾下,如果将类实例化对象后,会执行内置方法为:会先执行__new__内置方法 而后会执行 __init__内置方法。当我们执行对象的时候,会执行__call__内置方法。

如果该类不是基于type来创建的,而是基于我们自己的元类,那么生命周期应该是怎么样的呢?

我们可以和之前探讨类的生命中周期一样,我们写一个案例,使用print来输出一些信息,来判断如果基于元类而言,那么生命周期是怎么样的。

我们定义代码如下:

上述代码,我们将类ClassName和其元类mateClass,我们都重写了__init____call____new__以及__del__方法。我们暂时先不管这些方法中的语句含义,我们先执行一次代码,看看执行结果:

哎,你是否感觉好奇,为什么我们还没有开始执行c = ClassName()就已经执行了mateClass类中的__new__方法 和 __init__方法呢?

这是因为我们在定义ClassName类的时候指定了其元类mateClass,所以当我们定义ClassName的时候,就会去执行该元类的__new__方法 和 __init__方法。

随后我们执行了c = ClassName(),这个是它会执行mateClass__call__方法,我们之前有介绍过,__call__方法不是要c()才调用么? 为什么这里调用了呢?

这是因为我们指定元类的时候,代码如下:

class ClassName(metaclass=mateClass):

这里打个比方,上述代码它相当于定义了一个ClassName,其类型为mateClass,所以当我们在执行c = ClassName()就会触发其类的__call__方法,所以会执行ClassName__call__方法。

随后才执行ClassName__new__方法 和 __init__方法。而后执行函数,最后销毁的时候,先销毁ClassName 再 销毁mateClass

那我们将其整理一下的话,可以图示为:

元类是如何控制类的创建过程的

上面已经演示了元类的生命周期,本篇文章我们将来看下,元类是如何控制类的创建过程的。

在此之前,我们要知道,元类通过什么样的方式来定义的类,可以看到我们上述的代码,在元类中的__new__方法中,我们返回了如下语句:

class mateClass(type):
    def __new__(cls, *args, **kwargs):
        newCls = super().__new__(cls, *args, **kwargs)
        return newCls

该语句会创建一个新类,随后将该类返回回去。

所谓的控制类的创建过程,我们就可以在该__new__中判断,传入的参数等信息,比如说,我们想要严格规定创建的类名,不少于6个字符,不多于20个字符,这个如何如何编写呢? 我们可以在元类中的__new__方法下获取传上来的类名,而后将其对比,若符合规则则返回类,若不符合规则,跑抛错:

class mateClass(type):
    def __new__(cls, *args, **kwargs):
        classname = args[0]
        nameLen = len(classname)
        if nameLen >= 6 and nameLen <= 20:
            newCls = super().__new__(cls, *args, **kwargs)
            return newCls
        else:
            msg = "Class name %s does not meet the specifications" % (classname)

上述代码,使我们定义了一个类mateClass,其继承type类,在该类中,我们重写了__new__方法,在该方法中,我们首先获取类名args[0]将其赋值给classname,而后进行匹配,若长度大于6且小于20,则创建类,否则就抛错。

介于此,我们可以创建类,将元类指向mateClass,例如:

class ClassName(metaclass=mateClass):
    pass

该类名就符合规则,不会报错,若将名称更换为其他不符合规则的名称,则会抛错:

例如:

class d123(metaclass=mateClass):
    pass

若我们将名称修改为长名称,如:

class d888888888888888abdassd(metaclass=mateClass):
    pass

这个案例就是所谓的使用元类来控制类的创建等。非常灵活,也非常强大。

总结

本篇文章,我们先介绍了元类的生命周期,元类的生命周期为,在定义类a指定其元类时候,元类就会执行__new____init__方法。在将类a给实例化的时候,就会执行元类的__call__方法。后面就和普通的类调用生命周期差不多。后面我们介绍了元类是如何控制类的创建过程的,我们介绍了几个例子来说明该功能。

到此这篇关于python面向对象值元类的声明周期详解的文章就介绍到这了,更多相关python元类声明周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python第三方库xlrd/xlwt的安装与读写Excel表格

    Python第三方库xlrd/xlwt的安装与读写Excel表格

    最近开始学习python,想做做简单的自动化测试,需要读写excel,于是就接触到了Python的第三方库xlrd和xlwt,下面这篇文章就给大家主要介绍了Python中第三方库xlrd/xlwt的安装与读写Excel表格的方法,需要的朋友可以参考借鉴。
    2017-01-01
  • Python Process创建进程的2种方法详解

    Python Process创建进程的2种方法详解

    这篇文章主要介绍了Python Process创建进程的2种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python输入一个水仙花数(三位数) 输出百位十位个位实例

    python输入一个水仙花数(三位数) 输出百位十位个位实例

    这篇文章主要介绍了python输入一个水仙花数(三位数) 输出百位十位个位实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python利用elaphe制作二维条形码实现代码

    python利用elaphe制作二维条形码实现代码

    条形码的应用将会越来越广泛,看到了一篇文章,写的挺好的!用手机拍二维码,查二维码确实很爽!这将成为一种潮流
    2012-05-05
  • Python3.9.0 a1安装pygame出错解决全过程(小结)

    Python3.9.0 a1安装pygame出错解决全过程(小结)

    这篇文章主要介绍了Python3.9.0 a1安装pygame出错解决全过程(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python读取文件的三种方式总结

    Python读取文件的三种方式总结

    Python的文本处理是经常碰到的一个问题,非常重要的,这篇文章主要和大家分享的是3个Python读取文本文件内容的常用方法,希望对大家深入学习Python有所帮助
    2023-07-07
  • python读取多类型文件夹中的文档内容

    python读取多类型文件夹中的文档内容

    无论我们使用哪种编程语言,处理文件对于每个程序员都是必不可少的,本文主要介绍了python读取多类型文件夹中的文档内容,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • PyTorch实现图像识别实战指南

    PyTorch实现图像识别实战指南

    图像识别是从给定图像中提取有意义的信息(例如图像内容)的过程,下面这篇文章主要给大家介绍了关于PyTorch实现图像识别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Pandas时间数据处理详细教程

    Pandas时间数据处理详细教程

    日常工作中日期格式有多种表达形式,比如年份开头或是月份开头2022/6/4、6/4/2022等,通过pandas的日期数据处理,这篇文章主要给大家介绍了关于Pandas时间数据处理的相关资料,需要的朋友可以参考下
    2023-01-01
  • 浅谈python数据类型及其操作

    浅谈python数据类型及其操作

    今天带大家了解python数据类型的相关知识,文中介绍的非常详细,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05

最新评论