1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

Python超详细的讲解元类应用

Python中的元类

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

Python超详细的讲解元类应用

类的定义

下面是一个类的定义的示例:

#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