关于python的元类

当你创建一个类时:
class Foo(Bar):
    pass

Python做了如下的操作:

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

关于什么是类元,下面这篇文章很完美了,不需要修改!

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

 

在元类中使用带标签的描述符

 1 class Descriptor(object):
 2     def __init__(self):
 3         # notice we aren't setting the label here
 4         self.label = None
 5 
 6     def __get__(self, instance, owner):
 7         print('__get__. Label = %s' % self.label)
 8         return instance.__dict__.get(self.label, None)
 9 
10     def __set__(self, instance, value):
11         print('__set__')
12         instance.__dict__[self.label] = value
13 
14 
15 class DescriptorOwner(type):
16     def __new__(cls, name, bases, attrs):
17         # find all descriptors, auto-set their labels
18         for n, v in attrs.items():
19             if isinstance(v, Descriptor):
20                 v.label = n     #这里的v.相当于x
21         return super(DescriptorOwner, cls).__new__(cls, name, bases, attrs)
22 
23 
24 class Foo(object):
25     __metaclass__ = DescriptorOwner
26     x = Descriptor()

结果为:

f = Foo()
f.x = 10
print(f.x)
第6行:__get__(self, instance, owner):中的self代表的是实例x,instance是实例f,owner代表类别Foo;
第10行:__set__(self, instance, value)中的self代表的是实例x,instance是实例f,val值为10。



posted on 2017-01-13 19:03  wzxds02  阅读(634)  评论(0编辑  收藏  举报

导航