Python中的元类
在Python中,所有的数据都是目标(object),包括数据、字符串、数组和函数等。这些目标都需要通过类(class)来建立。因此,类也是目标。

类的定义
下面是一个类的定义的示例:
#object为高层成员变量
class Work(object):
a = 100
MyWork = Work() # 创建对象
print(MyWork) # MyWork是Work所建立的一个对象
print(type(MyWork)) # 思考:MyWork的种类是由谁建立的?
print(type(Work)) # 为非元类
从上面的示例中,我们可以看到目标MyWork是由类Work建立的。然而,创建类Work的方式是通过一个叫做type的类来建立的。也就是说,MyWork -> Work -> type创建。
上述示例中的目标是实例化的,类是由搜索关键词class声明定义的。
那么class搜索关键词背后的机制是什么呢?事实上,class Work(object)这种写法等同于Work = type(‘Work’, (object,), {“a”: 100})。也就是说,类type通过创建对象创立了它的目标Work,并且这个Work往往也是一个类。这样创造类的类就是Python的元类。而Python自带的元类叫做type。
元类的使用
根据Python的源代码可以看出,type是用于创建全部类的元类。
具体地,元类可以用于以下两个方面:
- 用于创建类:type(object_or_name, bases, dict)
- 用于获取数据类型:type(object) -> the object’s type
下面是一个创建类的示例:
#根据class定义类
class MyClass(object):
a = 100
b = 200
#根据type创建的类(实例化类)
MyClass1 = type(“MyClass1”, (object,), {“a”: “100”, “b”: “200”})
print(MyClass) # MyClass是由class定义的类
print(MyClass1) # MyClass1由type创建的类
如果需要定义实例方法和类属性,则可以将它们以字典的形式传入。
当然,自定义元类也是元类的一种应用。在自定义元类时,需要继承类type并重写new方法,具体如下:
#定义一个类继承type
class MyTest(type):
#重写new方法
def __new__(cls, type_name, bases, attrs, *args, **kwargs):
new_cls = super().__new__(cls, type_name, bases, attrs)
return new_cls # 返回新的类
M2 = MyTest(“M2”, (MyTest,), {“attrs”:100})
print(M2) # <class ‘__main__.M2’>
最后,使用自定义元类创建类时需要指定metaclass=指定的元类。
以上就是关于Python中元类的介绍,希望对大家有所帮助。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6792.html
