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中关于类实例化的问题
类实例化成对象,不是首先应该调用构造函数吗,__call__是针对已经实例化的对象作为函数的时候用的吧
我无法理解你的问题
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 被返回。
我帖子所提的问题也是这个网址在文章末尾提出的关注点,我就是不明白要怎么理解
自己顶一下,恳请大家指点,感谢啊!!!!

