此快速提示简要概述了Python中的元类的含义,并显示了该概念的一些示例。
在深入研究本文之前,我应该指出一个关于Python中类的要点,它使我们更容易掌握元类的概念。
类是Python中的对象吗?
如果您使用的是Python以外的编程语言,那么您所了解的有关类的概念很可能是一种用于创建新对象的方式。 在Python中也是如此,但是Python甚至更进一步-类也被视为对象!
因此,如果您在Python中创建了以下类:
class myClass(object):
pass
这仅表示已在内存中创建了名为myClass
的对象 。 由于此对象能够创建新对象,因此将其视为class 。 这意味着我们可以在Python中的类上应用对象操作,因为类本身就是对象。
因此,我们可以对类进行操作,例如将类分配给变量,如下所示:
class_object = myClass()
print class_object
哪个返回:
<__main__.myClass object at 0x102623610>
您甚至可以将myClass
类作为参数传递给方法,如下所示:
def class_object(object):
print object
class_object(myClass)
返回以下输出:
<class '__main__.myClass'>
除了其他操作,您通常可以应用于对象。
元类
也许您在Python中遇到过type
关键字? 您很可能用它来检查某些对象的类型,如以下示例所示:
print type('abder')
print type(100)
print type(100.0)
print type(int)
在这种情况下,您将获得以下输出:
<type 'str'>
<type 'int'>
<type 'float'>
<type 'type'>
查看输出,直到您进入type type
为止,一切似乎都很清晰。 为了了解这可能意味着什么,让我们回到本文开头定义的类:
class myClass(object):
pass
现在,执行以下操作:
print type(myClass)
该语句的输出是什么? 令人惊讶的是:
<type 'type'>
因此,我们可以得出结论,Python中的类的类型为type
!
type
和metaclass
之间有什么关系? 好吧,如果默认metaclass
是type
,则type
是metaclass
metaclass
。 我知道这可能会造成混淆,尤其是该type
可用于返回某些对象的类,如上所示,但这是由于Python向后兼容。 因此,如果您写:
print type(type)
你会得到:
<type 'type'>
意思是一个type
就是一个type
!
metaclass
一词仅表示用于创建类的内容 。 换句话说,它是类的类,这意味着在这种情况下,类的实例是类。 因此,由于type
的实例是metaclass
,因此将type
视为metaclass
类。
例如,当我们在上面提到以下语句时:
class_object = myClass()
这只是建立了myClass
类的对象/实例。 换句话说,我们使用了一个类来创建一个对象。
同样,当我们执行以下操作时:
class myClass(object):
pass
metaclass
用于创建类myClass
(被视为type
)。 因此,就像对象是类的实例一样,类是metaclass
的实例。
使用元类创建类
在本节中,我们将看到如何使用metaclass
来创建类,而不是使用在类和对象教程中看到的class
语句。 正如我们在上面看到的,默认的metaclass
是type
。 因此,我们可以使用以下语句创建一个新类:
new_class = type('myClass',(),{})
如果您想简化操作,可以将相同的类名myClass
分配给变量名。
此处的字典{ }
用于定义类的属性。 因此,具有以下语句:
myClass = type('myClass',(),{'a':True})
类似于:
class myClass(object):
a = True
__metaclass__属性
假设我们如下创建类myClass
:
class myClass(object):
__metaclass__ = myMetaClass
pass
在这种情况下,将使用myMetaClass
而不是type
来创建type
,如下所示:
myClass = myMetaClass(className, bases, dictionary)
元类的创建和初始化
如果要控制类创建之后如何创建和初始化类,则可以分别分别使用元类__new__
方法和__init__
构造函数。 因此,当myMetaClass
上面的myMetaClass
时,这将在幕后发生:
myClass = myMetaClass.__new__(myMetaClass, name, bases, dictionary)
myMetaClass.__init__(myClass, name, bases, dictionary)
我不想让这个快速提示变得冗长,但总而言之,我们可以得出结论,在Python中使用了metaclass
来创建类。 也就是说, metaclass
的实例是一个类。 如果您想更深入地研究元类,可以查看本教程 。
翻译自: https://code.tutsplus.com/tutorials/quick-tip-what-is-a-metaclass-in-python--cms-26016