首页IT科技python元类及用法(详解Python元类(metaclass))

python元类及用法(详解Python元类(metaclass))

时间2025-06-20 20:33:37分类IT科技浏览5361
导读:什么是元类?...

什么是元类?

理解元类(metaclass)之前              ,我们先了解下Python中的OOP和类(Class)               。

面向对象全称 Object Oriented Programming 简称OOP                      ,这种编程思想被大家所熟知                     。它是把对象作为一个程序的基本单元       ,把数据和功能封装在里面       ,能够实现很好的复用性                      ,灵活性和扩展性       。OOP中有2个基本概念:类和对象:

是描述如何创建一个对象的代码段              ,用来描述具有相同的属性和方法的对象的集合       ,它定义了该集合中每个对象所共有的属性和方法

对象是类的实例(Instance)               。

我们举个例子:

In:classObjectCreator(object): ...:pass ...: In:my_object=ObjectCreator() In:my_object Out:<__main__.ObjectCreatorat0x1082bbef0>

而Python中的类并不是仅限于此:

In:print(ObjectCreator) <class__main__.ObjectCreator>

ObjectCreator竟然可以被print                      ,所以它的类也是对象!既然类是对象              ,你就能动态地创建它们,就像创建任何对象那样                     。我在日常工作里面就会有这种动态创建类的需求                      ,比如在mock数据的时候                      ,现在有个函数func接收一个参数:

In:deffunc(instance): ...:print(instance.a,instance.b) ...:print(instance.method_a(10)) ...:

正常使用起来传入的instance是符合需求的(有a              、b属性和method_a方法),但是当我想单独调试func的时候              ,需要「造」一个                      ,假如不用元类       ,应该是这样写:

In:defgenerate_cls(a,b): ...:classFake(object): ...:defmethod_a(self,n): ...:returnn ...:Fake.a=a ...:Fake.b=b ...:returnFake ...: In:ins=generate_cls(1,2)() In:ins.a,ins.b,ins.method_a(10) Out:(1,2,10)

你会发现这不算算是「动态创建」的:

类名(Fake)不方便改变

要创建的类需要的属性和方法越多              ,就要对应的加码                      ,不灵活       。

我平时怎么做呢:

In:defmethod_a(self,n): ...:returnn ...: In:ins=type(Fake,(),{a:1,b:2,method_a:method_a})() In:ins.a,ins.b,ins.method_a(10) Out:(1,2,10)

到了这里       ,引出了type函数        。本来它用来能让你了解一个对象的类型:

In:type(1) Out:int In:type(1) Out:str In:type(ObjectCreator) Out:type In:type(ObjectCreator()) Out:__main__.ObjectCreator

另外       ,type如上所说还可以动态地创建类:type可以把对于类的描述作为参数                      ,并返回一个类                     。

用来创建类的东东就是「元类」

MyClass=type(MyClass,(),{})

这种用法就是由于type实际上是一个元类              ,作为元类的type在Python中被用于在后台创建所有的类              。在Python语言上有个说法「Everything is an object」        。包整数                      、字符串       、函数和类... 所有这些都是对象                      。所有这些都是由一个类创建的:

In:age=35 In:age.__class__ Out:int In:name=bob In:name.__class__ Out:str ...

现在       ,任何__class__中的特定__class__是什么?

In:age.__class__.__class__ Out:type In:name.__class__.__class__ Out:type ...

如果你愿意                      ,你可以把type称为「类工厂」              。type是Python中内建元类              ,当然,你也可以创建你自己的元类。

创建自己的元类

Python2创建类的时候                      ,可以添加一个__metaclass__属性:

classFoo(object): __metaclass__=something... [...]

如果你这样做                      ,Python会使用元类来创建Foo这个类                      。Python会在类定义中寻找__metaclass__                     。如果找到它,Python会用它来创建对象类Foo。如果没有找到它              ,Python将使用type来创建这个类               。

在Python3中语法改变了一下:

classSimple1(object,metaclass=something...): [...]

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站点击率多少算高(如何靠网上点击率赚钱-暴利生意: 我靠副业2个星期赚了20000块:你看不起的行业,真的很赚钱!)