元类
Python 2.7.5 旧式类
class Foo(): pass foo = Foo() print(type(foo)) print(type(Foo)) print(type(type)) # <type 'instance'> # <type 'classobj'> # <type 'type'>
Python 3.6.5 新式类
class Foo(): pass foo = Foo() print(type(foo)) print(type(Foo)) print(type(type)) # <class '__main__.Foo'> # <class 'type'> # <class 'type'>
type是一个元类,任何类都是它的实例。
就像一个普通的对象是一个类的实例一样
Python中的任何新式类 以及 Python3中的任何类 都是type元类的一个实例
x是类Foo的一个实例。
Foo是type元类的一个实例。
type也是type元类的一个实例,所以它是它自己的一个实例。
以下测试,在Python 3.6.5 中完成
动态定义类
type函数
type(<name>, <bases>, <dict>) <name> 类名称 __name__属性 <bases> 继承类的基类元组,__bases__属性 <dict> 包含类主体定义的名称空间字典,__dict__属性
例如
# -*- coding: utf-8 -*- def get_name(self): return "foo" # 定义类 Foo = type("Foo", (object, ), {"name": "foo", "get_name": get_name}) foo = Foo() # 获取属性 print(foo.name) # foo # 调用方法 print(foo.get_name()) # foo
以上定义的类相当于
class Foo(object): name = "foo" def get_name(self): return "foo"
通过元类的方式给子类添加属性
# -*- coding: utf-8 -*- class Meta(type): def __new__(cls, name, bases, dct): instance = super().__new__(cls, name, bases, dct) instance.name = "meta" return instance class Foo(metaclass=Meta): pass print(Foo.name) # meta
通过继承的方式给子类添加属性
# -*- coding: utf-8 -*- class Base(object): name = "meta" class Foo(Base): pass print(Foo.name) # meta
通过类装饰器的方式给子类添加属性
# -*- coding: utf-8 -*- def decorator(cls): class NewClass(cls): name = "meta" return NewClass @decorator class Foo(object): pass print(Foo.name) # meta
参考