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的东西都可以

 

posted @ 2020-05-25 19:01  一日学一日功  阅读(374)  评论(0编辑  收藏  举报