理解python的类实例化
class type(name, bases, dict)官方定义
object.__new__(cls[, ...])官方定义
Customizing class creation 定制类创建 官方文档
Built-in Types 内建类型 官方文档
准备知识
- 当一个类定义被执行,发生了这些事:
- 一个合适的元类被确定
- 类命名空间被准备好
- 类主体被执行
- 类对象被创建
- 类中定义的
__new__(cls[, ...])方法用来创建类cls的一个新实例,它是特殊的不用声明的静态方法。 - 类中对
__call__方法的定义意味着对该类的实例的括号运算符的重载。 -
type(x)返回x的类型。类是元类的实例(Python中一切皆对象,类也是对象,对象是类的实例,只不过类的类是特殊的元类),所以int的类是type(元类)。表示构造关系。整型1由int类构造,int类由元类构造。(类名+括号运算符调用类的构造函数,类定义的过程即是元类实例化的过程,元类中实现了构造类的规则)。
a = 1
type(a)
# int
type(int)
# type

-
x.__mro__返回类x的所有超类(父类)(包括x自身)(MRO-方法解析顺序),表示类之间的继承关系,int继承object。继承关系和构造关系是两回事。
int.__mro__
# (int, object)

实验
理解

MyType继承type并重载type中的方法,是我们自定义的元类。指定类MyTypeInstance的元类为MyType意味着用MyType来构建类MyTypeInstance。MyType中重载的__new__和__init__方法影响类MyTypeInstance的定义过程。__new__可以控制类名与类属性的审查,__init__可以增加或修改类的属性。而MyType的__call__方法则控制类MyTypeInstance的实例化过程。MyType的元类默认是type(与继承type无关),即MyType是type的实例,亦即MyType = type(name, bases, dict),MyType的定义过程(即type类的实例化过程)调用的是type的__call__方法。
__new__是静态方法,__call__和__init__是实例方法。实际上isinstance(type, type)得到True,即type是type的实例,type调用__call__方法也就说得通了,也就是type实例+()运算符 等于type实例调用了它的类type中定义的__call__实例方法。在__call__方法中先调用__new__静态方法来产生一个python对象,然后调用type实例的__init__方法修改新对象的属性。










