python中metaclass的理解
python中所有的东西都是对象。
因此python中的类也是对象,它是一种特殊的对象,特殊在这个对象自身拥有创建对象的能力(这个对象(类)自身拥有创建对象(类实例)的能力),因此类的本质仍然是一个对象,而对于对象可以做如下的操作:
1) 可以将它赋值给一个变量
2) 可以拷贝它
3) 可以为它增加属性
4) 可以将它作为函数参数进行传递
既然类也是对象,那么类生成的过程是否与对象的生成过程是类似的?
类(class)是type类型的实例。
按照我们常见的创建类的实例(instance)的方法,
instance=class(*args)
例如:
class Foo():
pass
f = Foo()
那么类(class)应该就是用 class="type"(*args)这种方式创建的。
python document中有明确描述:
class type(name, bases, dict)
With three arguments, return a new type object.
这种方式创建一个类(class)看起来不像我们经常使用的定义类的方法,这种方法的优势就是可以动态的创建一个类。
我们平常动态创建类的方法:
这种类的创建方法也不是完全动态的,因为自己需要动手写整个类。
当我们想到既然类也是对象,那么也可以由别的生成啊(不需要我们自己手动写啊),这就是用到metaclass的时候了。
当你使用class关键字 时,Python解释器自动创建这个对象。
我们常用的type功能就是看一个对象是什么类型
而type还有有一种完全不同的能力,它能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类对象
type(
类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
注意使用type创建的这个类的名字,是type函数第一个参数,而不是赋值的对象(对象名字)
在Python中,类也是对象,你可以动态的创建类,这就是当使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。
元类就是用来创建类的“东西”。元类就是用来创建这些类的,元类就是类的类。
使用type这样创建的类,可以动态的创建类,什么叫动态的创建类,例如可以动态的在类中添加已有的方法
甚至当类创建完毕,仍然可以往刚创建的类中添加方法
classes are objects, and you can create a class dynamically.This is what Python does when you use the keyword class
, and it does so by using a metaclass.
__metaclass__属性
前边的理论是让你明白metaclass是个什么东西,是创建类的类,是创建一个特殊的对象(类),这个特殊的对象(类)能生成其他的对象(实例)。
使用metaclass的主要目的就是:当类class自动创建的时候,使用metaclass来改变类的创建过程。
而在类中添加__metaclass__属性,那么python就会利用metaclass类创建当前的这个类
可以在写一个类的时候为其添加__metaclass__属性。
如果这么做了,Python就会用metaclass(元类)来创建类Foo。如果没有找到,就会用内建的type来创建这个类。
类中有__metaclass__这个属性吗?
class
Foo(
object
):
__metaclass__
=
something…
当写下 class Foo(object)
的时候,这个类还没有在内存中产生
Python 会在类的定义中查找 __metaclass__
如果类中有__metaclass__属性,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象 。
如果Python没有找到__metaclass__,它会继续在父类(object)中寻找__metaclass__ 属性,并尝试做和前面同样的操作。
如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找 __metaclass__,并尝试做同样的操作。
如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。
现在的问题就是,你可以在__metaclass__中放置些什么代码呢?
答案就是:可以创建一个类的东西。那么什么可以用来创建一个类呢?
type,或者任何使用到type或者子类化type的东西都可以。