python 元类

http://blog.jobbole.com/21351/

 

元类(metaclass

类型对象,负责创建对象实例,控制对象行为(方法)。而创建类型对象的是元类(metaclass),也就是类型的类型。

当解释器创建类型对象时,会按照以下顺序查找_metaclass_属性:

Class.__metaclass__ -> bases.__metaclass__ -> module.__metaclass__ -> type

 

类也是对象,可以在运行时动态创建

type可以动态的创建类,可以接受一个类的描述作为参数,然后返回一个类。

Type(类名,父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

>>> MyShinyClass = type("MyShinyClass",(),{"test":1})

>>> print MyShinyClass

<class '__main__.MyShinyClass'>

>>> f = MyShinyClass()

>>> print f.test

1

 

元类是用来创建类的“东西”,它们是类的类

MyClass = type("MyClass",(),{})

type是一个元类,在python中用来创建所有类的元类。

>>> age = 35

>>> age.__class__

<type 'int'>

>>> age.__class__.__class__

<type 'type'>

>>> class Bar(object):pass

 

>>> b = Bar()

>>> b.__class__

<class '__main__.Bar'>

>>> b.__class__.__class__

<type 'type'>

 

__metaclass__属性

你可以在写一个类的时候为其添加__metaclass__属性。

 

1

2

3

class Foo(object):

    __metaclass__ = something…

[…]

如果你这么做了,Python就会用元类来创建类Foo。小心点,这里面有些技巧。你首先写下class Foo(object),但是类对象Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类

针对下面的代码,

1

2

class Foo(Bar):

    pass

Python做了如下的操作:

Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路)。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象

posted on 2015-08-26 11:20  zxahu  阅读(299)  评论(0编辑  收藏  举报

导航