理解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__
方法修改新对象的属性。