问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

元类是什么,我们将它们用于什么?

发布网友 发布时间:2022-04-30 12:47

我来回答

3个回答

懂视网 时间:2022-05-10 09:17

在python中,类也是对象,当我们使用class关键词创建一个类的时候,Python解释器仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。那么你知道创建类的是什么吗?其实他是元类。

元类是什么?

元类实际上就是用来创建类的东西。

为了帮助我们理解,我们可以这样想,我们创建类就是为了创建类的实例,同样的,我们创建元类就是为了创建类。

元类就是类(实例)的类,就像下面这样

Metaclass() = class
class() = object # object==>实例

理解了什么是元类,我们再来看一看type()函数。

其实type就是一个元类,type就是我们用来创建所有的类的元类。(如果我们要创建自己定义的元类的话,也要从type中继承)

元类的工作原理:

我们来看一下下面这个例子

class ReedSunMetaclass(type):
 pass
class Foo(object, metaclass = ReedSunMetaclass): 
 pass
class Bar(Foo):
 pass

首先,我们创建了一个元类ReedSunMetaclass

(注意!按照默认习惯,元类的类名总是以Metaclass结尾,以便清楚地表示这是一个元类)。

然后,我们又用元类ReedSunMetaclass创建了一个Foo类。

(同时,Foo类的属性__metaclass__就变成了ReedSunMetaclass)。

最后,我们创建了一个子类Bar继承自Foo。

我们来试着理解一下在python内部是怎么执行这几个步骤的:

对于父类Foo,Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类。很显然,它找到了。

对于子类Bar, python会先在子类中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Bar,如果没有找到,就再从父类中寻找,直到type。显然,它在父类中找到了。

我们可以看到使用元类的一个好处了,即他可以让子类隐式的继承一些东西。

热心网友 时间:2022-05-10 06:25

类是对象
在理解元类之前,必须掌握Python中的类,Python中的类是非常特别的思想,其借鉴自Smalltalk 语言。
在许多语言中,类是一段描述如何产生对象的代码。Python也是如此.12
>>> class ObjectCreator(object):
pass >>> my_object = ObjectCreator()>>> print(my_object)
<__main__.ObjectCreator object at 0x00000295A6FC1C50>>>> 123456

但是在Python中类不仅仅是如此,类也是对象。当你使用关键字class时,Python解释执行并创建了一个对象。
class ObjectCreator(object):
pass12

# 在内存中创建一个名字是 ObjectCreator的对象类) 自己具有创建对象[实例]的能力 ,这就是其被称为类的原因。但是类的本质还是一个对象,这是因为:
• 可以将它赋值给一个变量
• 可以复制他
• 可以给他添加属性
可以将它当做参数传递给一个函数
e.g:

>>> print(ObjectCreator) # 你可以打印类,因为其是一个对象<class '__main__.ObjectCreator'>>>> echo = lambda o : print(o)
>>> echo(ObjectCreator) #当做参数传递给一个函数<class '__main__.ObjectCreator'>>>> print(hasattr(ObjectCreator,'new_attribute'))
False
>>> ObjectCreator.new_attribute = 'foo' #添加属性给一个类>>> print(hasattr(ObjectCreator,'new_attribute'))
True
>>> print(ObjectCreator.new_attribute)
foo
>>> ObjectCreatorMirror = ObjectCreator # 将类赋值给一个变量>>> print(ObjectCreatorMirror.new_attribute)
foo
>>> print(ObjectCreatorMirror())
<__main__.ObjectCreator object at 0x00000295A6FCF748>
>>>

热心网友 时间:2022-05-10 07:43

元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。
尽管在Python中您可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。您将无法type纯粹使用Python 重新创建类似的东西,但是Python有点作弊。要在Python中创建自己的元类,您实际上只想将其子类化type。
元类最常用作类工厂。当通过调用类创建对象时,Python通过调用元类来创建一个新类(执行“ class”语句时)。因此,将元类与普通方法__init__和__new__方法结合使用,可以使您在创建类时做“额外的事情”,例如使用某些注册表注册新类或将其完全替换为其他类。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 关于python元类遇到冲突问题的问题(Metaclass conflict)? 请问一下什么是元类啊 ?它的具体作用是什么?谢谢您 python 元类生成类的方法是什么类型的 python 元类创建行为 子类会继承么 Mate10手机投屏时使用 VGA 和 DVI 接口大屏不能正常显示 python 3.x 中的元类 有人买过Type-C转DVI转换器吗? 为什么vivo手机的充电插口是反的? vivo手机充电接口坏了 怎么能充电 电脑桌面的快捷方式变成白的,但是软件可以正常运行? 电脑桌面变成白色e的图标了,但可以打开程序,是怎么回事? 电脑图片只显示白色的图标,但是可以打开看,已经把始终显示图标,从不显示缩略图去掉勾选~ 我手机掉马桶里了拿出来打电话有声音看电视微信没有声音、怎么办啊 手机掉厕所里了!拿起来后要怎么办? 手机掉厕所捞出来关机用水冲了下!接下来怎么办! nova7手机掉进厕所里了捞出来之后晃动过,也用吹风机吹过,怎么办? 荣耀手机掉到厕所里了,但是马上就捞起来了,而且手机也没有问题,,已经... lxv-009最后一个名字 vivoy55系统修复 vivo手机系统出错开不了机怎么办 python求助,继承type是个怎么回事 高手能举例说下python语言中元类要怎么理解吗 pythoncharm有哪些奇技淫巧 这是哪的电话? 光大银行信用卡1积分值多少钱 被封了,没好友辅助,如何解封? 被封了没有好友辅助验证怎么办? 上一次的网贷还没还清可以继续贷吗??? 工行企业网上银行“网贷通”业务的约定还款期限是否包含约定日期当天? 限制登录没有好友辅助验证可以解封吗? 网贷欠了两万多块钱,七天期限的,马上到期了,哪位好心人先帮帮我还上, 网贷一次还清的最长还款期限是多久? 农村信用社小额贷款1年续贷期限是多长时间 被封了没有好友辅助验证怎么办? _百度问一问 我网贷有过逾期,以后再想贷款是不是就不好贷了 网贷下款时银行卡错误资金冻结了但有借款就,时间到了会自动扣银行卡的钱吗? 政治必修二第二单元的重点 及容易出选择题和材料题的点? 苹果催熟方法 苹果如何催熟?