实例化过程Cpython过程等价为
def __call__(obj_type, *args, **kwargs):
obj = obj_type.__new__(*args, **kwargs)
if obj is not None and issubclass(obj, obj_type):
obj.__init__(*args, **kwargs)
return obj
假设有一个类Foo:
class Foo(object):
def __init__(self, x, y=0):
self.x = x
self.y = y
然后实例化
f = Foo(1, y=2)
执行过程为
- Foo(*args, **kwargs) 首先调用 Foo.__call__(*args, **kwargs),如果没有__call__则调用tp_call属性(解释器内置,C语言)
- 因为 Foo 是object的子类,所以 Foo.__call__(*args, **kwargs) 调用的是 object.tp_call(Foo, *args,**kwargs)
- object.tp_call(Foo, *args, **kwargs) 调用的是 object.__new__(Foo, *args, **kwargs),然后返回了 obj
- obj 被 obj.__init__(*args, **kwargs) 初始化
- 最后 obj 就被返回了
同时,如果子类中未定义__init__,则父类的__init__方法会在子类的各属性及方法初始化后再调用,例如先定义基类
import math
class Structure1:
# Class variable that specifies expected fields
_fields = []
def __init__(self, *args):
if len(args) != len(self._fields):
raise TypeError('Expected {} arguments'.format(len(self._fields)))
# Set the arguments
for name, value in zip(self._fields, args):
setattr(self, name, value)
然后使你的类继承自这个基类
# Example class definitions
class Stock(Structure1):
_fields = ['name', 'shares', 'price']
class Point(Structure1):
_fields = ['x', 'y']
class Circle(Structure1):
_fields = ['radius']
def area(self):
return math.pi * self.radius ** 2
使用这些类的示例均实例化成功:
>>> s = Stock('ACME', 50, 91.1)
>>> p = Point(2, 3)
>>> c = Circle(4.5)
参考http://liuliqiang.info/post/understanding-python-class-instantiation
参考Stackoverflow
参考Python Cookbook