1
fffflyfish 2017-07-04 20:55:56 +08:00
类实例化成对象,不是首先应该调用构造函数吗,__call__是针对已经实例化的对象作为函数的时候用的吧
![屏幕快照 2017-07-04 下午 8.55.25.png]( https://ooo.0o0.ooo/2017/07/04/595b904e49327.png) |
2
tonychow 2017-07-05 00:12:51 +08:00
__call__(self[, args...]) 方法是实例方法而非类方法
ref https://docs.python.org/2/reference/datamodel.html#emulating-callable-objects |
3
saximi OP @tonychow 谢谢,我是在 http://www.jianshu.com/p/f63ad9d550f1 这篇文章中看到对于常规类的实例化步骤描述为大致等同如下:
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 __new__方法为对象分配了内存空间,构建它为一个“空"对象然后__init__方法被调用来初始化它。总的来说: Foo(*args, **kwargs)等价于 Foo.__call__(*args, **kwargs) 既然 Foo 是一个 type 的实例,Foo.__call__(*args, **kwargs)实际调用的是 type.__call__(Foo, *args, **kwargs) type.__call__(Foo, *args, **kwargs)调用 type.__new__(Foo, *args, **kwargs),然后返回一个对象。 obj 随后通过调用 obj.__init__(*args, **kwargs)被初始化。 obj 被返回。 我帖子所提的问题也是这个网址在文章末尾提出的关注点,我就是不明白要怎么理解 |
4
saximi OP 自己顶一下,恳请大家指点,感谢啊!!!!
|