python3 元类
我将通过讨论python类型系统的一些基础知识以及随后介绍META-CLASSES的概念来开始本课程。
首先,让我们看一下这些基本示例:
![](https://i-blog.csdnimg.cn/blog_migrate/f4252d5b2ed8ea4e0ea041cfff9fb5d7.png)
因此,您在python中创建的每件事都具有与之关联的类型。 在上面的示例中,变量名称的类型为str
( string
),age类型的类型为int
( integer
),但是这些变量中的每一个都具有__class__
的属性或属性,在大多数情况下,我们在python中称呼魔术方法,该属性是在创建变量时实例化的类,换句话说,它是变量的类型。 因此,在这种情况下, type(name)
和name.__class__
将返回与变量name
str
( string
)相同的数据。
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/6a35a72747d89affeddf9d2b2bd3855b.png)
但是,这种想法也扩展到您自己创建的类。
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/7b7f4870a4104a57b5a355dd865466e6.png)
根据示例,我们可以看到变量me
的类型为User
而该类型本质上是我们最初实例化的类,因此要创建新实例,请使用类名称以及预期的参数或参数,这些参数或参数将在以后成为关联的类型。 但是,类也具有与它们关联的类型。
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/aaf4142d983444b4fb066b5ccc25ffee.png)
因此, User
类的类型为type
,这意味着类型类已使用其预期参数实例化,而python会负责创建类User
。 此外, type
类采用的参数是(clsname,bases,methods)
,因此让我们看看它们在后台如何工作。
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/3849f0ed0caafdf0896cc5c3d55b2afc.png)
因此,本质上python所做的是,当您创建一个类时,它将采用clsname, bases and the functions or methods
并将其提供给类type
。
那么为什么使用meta-classes ,事实证明,类type
实际上是可以自定义和修改的东西。 问题是我们该怎么做。 我们修改类的方法是通过继承。 即
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/fa3166c192b945c62c0067174bdc556d.png)
完成后,我认为我们已经准备就绪!!!! 所以我们去试驾
看到:
![](https://i-blog.csdnimg.cn/blog_migrate/fb1d380e79747779cd434a1d7367c5f9.png)
如我们所见,这几乎与类类型一样精确。 如果您注意到在使用我们创建的custom_type_class
创建新类时,必须在制作该类之前先打印一些信息,这意味着该类是通过我们之前创建的custom_type_class
创建的,因此,上面的类就是一个示例被称为META-CLASS 。
因此,一个元类的简单定义是:
监视或监督类定义中发生的情况的另一种方法
因此,python提供的是在类定义中使用上述方法的一种方法,即
![](https://i-blog.csdnimg.cn/blog_migrate/e96272369631e18ec3f79d09e6dd1be6.png)
基本上,创建一个类时的缺省参数metaclass
的说法是类的type
,我们不希望出现这种情况,所以我们修改使用custom_class_type
我们前面作为参数创建metaclass
等于是该类User
将与创建custom_class_type
。
结论
就这样! 您刚刚使用python学习了元类的基础知识,感谢后续! 如果您喜欢这个故事,请给这个故事几个React,以便更多的人看到它!
如果您喜欢这个,请给我买点东西:),如果您有任何疑问或任何疑问,请不要忘了发表评论。
您可以通过电子邮件kennethgabriel78@gmail.com与我联系。 谢谢您的时间再见:)。
翻译自: https://hackernoon.com/baby-steps-to-metaclasses-in-python3-xc4s249u
python3 元类