python|面向对象-3|元类的声明周期

简介: python|面向对象-3|元类的声明周期

我们上一篇文章介绍了什么是元类、元类的作用,以及创建类的2种方式,最后是创建如何定义元类,在python中,有一个特殊的类,称之为type类,也是元类。我们创建的所有类都基于此。

本篇文章,我们将继续介绍元类的用法。



元类的生命周期


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


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

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


我们定义代码如下:

image.png


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

image.png


哎,你是否感觉好奇,为什么我们还没有开始执行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


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

image.png



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


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


在此之前,我们要知道,元类通过什么样的方式来定义的类,可以看到我们上述的代码,在元类中的__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,其继承type类,在该类中,我们重写了__new__方法,在该方法中,我们首先获取类名args[0]将其赋值给classname,而后进行匹配,若长度大于6且小于20,则创建类,否则就抛错。


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

class ClassName(metaclass=mateClass):
    pass


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

例如:

class d123(metaclass=mateClass):
    pass

image.png

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

class d888888888888888abdassd(metaclass=mateClass):
    pass

执行代码后,也会抛错:

image.png


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



总结


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






相关文章
|
8天前
|
开发者 Python
Python元类实战:打造你的专属编程魔法,让代码随心所欲变化
【7月更文挑战第7天】Python的元类是编程的变形师,用于创建类的“类”,赋予代码在构建时的变形能力。
30 1
|
27天前
|
Python
Python进阶第一篇(Python的面向对象)
Python进阶第一篇(Python的面向对象)
|
9天前
|
设计模式 存储 Python
Python元类大揭秘:从理解到应用,一步步构建你的编程帝国
【7月更文挑战第6天】Python元类是创建类的对象的基石,允许控制类的生成过程。通过自定义元类,可在类定义时动态添加方法或改变行为。
16 0
|
11天前
|
设计模式 数据库 Python
震撼!Python元类:解锁编程宇宙的终极秘密武器
【7月更文挑战第4天】Python的元类是创建类的类,用于定制类的行为。例如,通过元类`MyMeta`,可在创建类时动态添加属性,如`version`。在ORM中,元类能自动将类属性映射为数据库表字段。另外,元类也能实现设计模式,如单例模式,确保类只有一个实例。元类提供对Python底层机制的控制,增强了代码的灵活性和功能性。
|
24天前
|
存储 Serverless Python
在python中字典和元类的使用技巧
【6月更文挑战第21天】探索Python编程:本文涵盖字典排序、阿姆斯壮数检查、最大公因数与最小公倍数计算、下划线用途(如存储解释器结果、忽略值、命名约定),以及数字分隔增强可读性。此外,用下划线分隔数字如1_000_000,便于读取二进制、八进制和十六进制数值。
65 7
在python中字典和元类的使用技巧
|
8天前
|
开发者 Python
元类,Python中的隐藏BOSS?掌握它,让你的编程之路畅通无阻
【7月更文挑战第7天】Python的元类是创建类的类,如同编程的“大BOSS”。它们让开发者在类创建时干预过程,添加功能,如自动注册、修改属性。元类通过`__new__`方法动态创建类,如示例中MetaClass得到Meta元类附加的属性。虽然使用需谨慎,以免增加复杂性,但元类提供了超越常规类的强大力量,解锁高级编程技术。
15 2
|
8天前
|
Python
告别平庸!Python元类:让你的代码设计思想跃升至新高度
【7月更文挑战第7天】Python的元类是创建类的类,用于在定义时定制类的行为。通过元类,可以在类创建时注入逻辑,比如添加方法或改变属性。例如,一个元类可以自动为所有类添加日志功能。元类应用广泛,如自动注册类、修改属性、实现单例模式和动态添加方法,提升代码设计的灵活性和效率。掌握元类,让代码设计超越常规。
15 1
|
19天前
|
Python
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
|
19天前
|
Python
Python面向对象基础与魔法方法详解
Python面向对象基础与魔法方法详解
|
19天前
|
Python
python面向对象
python面向对象
10 1

相关实验场景

更多