metaclass

本文来自stackoverflow

类也是对象

没错,python中一切皆对象,类也是对象。我们来证明一下

>>> class Foo: pass
>>> isinstance(Foo, object)
True
>>> print type(Foo)

每当你用到关键字class,Python就会执行它并且建立一个对象。上面的代码在内存中产生了一个叫Foo的对象,并且这个对象有创建实例(对象)的能力。

因为Foo是个对象,我们可以对其进行赋值操作,可以给它添加属性,或者作为函数的参数来使用

动态创建类

既然类是变量,我们就可以动态创建它

def create_class(name):
    if name == 'foo':
        class Foo(object):
            pass
        return Foo
    else:
        class Bar(object):
            pass
        return Bar

print create_class('foo')   # 
print create_class('foo')()   # <__main__.Foo object at 0x10f3b7e90>
print create_class('bar')   # 

现在你已经可以动态创建类了,并且可以使用创建的类来生成相应的实例。但是你还是需要手动敲出类定义来,还是不够动态啊。

更动态的方法,type

用type可以生成类,使用方法如下
type(类名, 父类名的元组 (针对继承情况,可以为空), 包含属性的字典(名称和值))

>>> Foo = type('Foo', (), {'bar':True})
>>> print Foo

>>> Foo()
<__main__.Foo object at 0x10186f290>

元类 (metaclass)

元类就是创建类的东西。元类创建类.它们是类的类

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

上面的代码是因为 type 就是一个元类。type是Python中创建所有类的元类.

>>> age = 35
>>> age.__class__

>>> name = "bob"
>>> name.__class__

>>> class Foo(object): pass
>>> f = Foo()
>>> f.__class__

>>> f.__class__.__class__

python 默认会使用type作为元类来创建类,如果使用者自定义了元类,则使用用户定义的元类来创建类

__metaclass__

class UpperAttrMetaclass(type):

    def __new__(cls, clsname, bases, dct):
        '''
          clsname: 将生成的类名,
          bases: 继承的父类
          dct: 属性
        '''
        uppercase_attr = {}
        for name, val in dct.items():
            if not name.startswith('__'):
                uppercase_attr[name.upper()] = val
            else:
                uppercase_attr[name] = val

        return super(UpperAttrMetaclass, cls).__new__(cls, clsname, bases, uppercase_attr)

class Foo():
    __metaclass__ = UpperAttrMetaclass
    bar = 'bip'

print(hasattr(Foo,"bar"))   # False
print(hasattr(Foo,"BAR"))  # True

元类的作用

拦截类的创建
修改一个类
返回修改之后的类

你可能感兴趣的:(metaclass)