关于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。