快速提示:什么是Python中的元类?

此快速提示简要概述了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'>

除了其他操作,您通常可以应用于对象。

元类

也许您在Py​​thon中遇到过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

typemetaclass之间有什么关系? 好吧,如果默认metaclasstype ,则typemetaclass 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语句。 正如我们在上面看到的,默认的metaclasstype 。 因此,我们可以使用以下语句创建一个新类:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值