Python中关于类实例化的问题

类实例化成对象时,首先应该是调用类中的__call__函数,在__call__函数中先用__new__方法为对象分配内存空间,然后再在__call__函数中调用__init__方法初始化对象。如果这么理解没错的话,是否可以自己来实现类中的__call__函数,达到覆盖默认函数的目的呢?
但是我在网上看到这段说明以及相关代码的运行结果,觉得不理解,恳请指点!

代码定义了 Foo 类,但又为 Foo 定义了一个 __call__方法,
资料上说这时 Foo(*args, **kwargs) 实例化对象时并不等于 Foo.call(*args, **kwargs):

>>> class Foo:
… def call(self):
… print(‘running call’)


>>> Foo()
<main.Foo object at 0x000000000227ABE0>

>>> Foo.call()
Traceback (most recent call last):
File “”, line 1, in

TypeError: call() missing 1 required positional argument: ‘self’
In this case, call is used to call instances of the class :

>>> Foo()()
running call
Python中关于类实例化的问题


5 回复

类实例化成对象,不是首先应该调用构造函数吗,__call__是针对已经实例化的对象作为函数的时候用的吧
屏幕快照 2017-07-04 下午 8.55.25.png


我无法理解你的问题

call(self[, args…]) 方法是实例方法而非类方法

ref https://docs.python.org/2/reference/datamodel.html#emulating-callable-objects

谢谢,我是在 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 被返回。


我帖子所提的问题也是这个网址在文章末尾提出的关注点,我就是不明白要怎么理解

自己顶一下,恳请大家指点,感谢啊!!!!

回到顶部