元类是什么,我们将它们用于什么?
发布网友
发布时间: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__方法结合使用,可以使您在创建类时做“额外的事情”,例如使用某些注册表注册新类或将其完全替换为其他类。