元类

Python的类本身也是一对象

class ObjectCreator(object):
    pass

该代码将在内存中创建一个对象,名字是ObjectCreator,这个对象(类)自身拥有创建对象(类实例)的能力
它本质上仍是一对象,于是可以对它做如下操作:

  1. 你可以将它赋值给一个变量

  2. 你可以拷贝它

  3. 你可以为它增加属性

  4. 你可以将它作为函数参数进行传递

动态的创建类

因为类也是对象,因此可以在运行时动态的创建。
如,可以在函数中创建类

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

动态创建类方法:
type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

元类

元类就是用来创建类的"东西".元类就是用来创建类的类。

MyClass = type('MyClass', (), {})
#type能实现动态的创建类,是因为type就是Python在背后用来创建所有类的元类。为什么type会采用小写而不是Type,可能是为了和str,int,等保持一致性,str是用来创建字符串对象的类,int是用来创建整数对象的类,type就是创建类对象的类。

__metaclass__

class UpperAttrMetaclass(type):
    def __new__(cls, name, bases, dct):
        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
        uppercase_attr  = dict((name.upper(), value) for name, value in attrs)
        return type.__new__(cls, name, bases, uppercase_attr)

class Foo(object):
    bar = 'bip'
    __metaclass__=UpperAttrMetaclass
    #元类不再是type,而是UpperAttrMetaclass,当然新的元类必须是与type有关的

元类的主要用途是创建API?(慢慢理解)

posted @ 2018-02-03 17:26  blog_hfg  阅读(118)  评论(0)    收藏  举报