python - 当我们调用一个类时会发生什么?

标签 python object

简而言之,来自Python,

Where C is a class, the statement x=C(23) is equivalent to:

x = C.__new__(C, 23) 
if isinstance(x, C): type(x).__init__(x, 23)

根据我的理解,object.__new__ 创建一个新的、未初始化的类实例,它接收作为第一个参数。

为什么需要使用isinstance()进行检查。显然 __new__ 将返回一个 C 类型的对象。

如果是的话,如果测试失败会发生什么?

由于可调用,因此对__new__的调用是在类的__call()__中完成的方法

我是否遗漏了什么,请向我澄清

最佳答案

Isn't it obvious that __new__ will return a object of type C.

一点也不。以下内容有效:

>>> class C:
...   def __new__(cls):
...     return "not a C"
...   def __init__(self):
...     print("Never called")
...
>>> C()
'not a C'

当您重写 __new__ 时,您可能会返回 cls 的实例,但您不是必需的> 到。这对于定义工厂类非常有用,工厂类不会创建自身的实例,而是创建其他类的实例。

请注意,您引用的内容不太准确。在第一步,x = C(32) 相当于 x = type.__call__(C, 32)。是type.__call__调用C.__new__,然后决定是否调用返回值的__init__方法。

您可以将 type.__call__ 视为类似的定义

def __call__(cls, *args, **kwargs):
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

将此应用于C,我们看到obj被设置为str'not a C',不是 C 的实例,因此在返回字符串之前不会调用 'not a C'.__init__

关于python - 当我们调用一个类时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61698002/

相关文章:

java - 获取 JSON 中的重复响应

javascript - 通过变量访问json对象值

java - 深度复制对象

Python - 删除包含列表列表的字典副本

python - 将列表设置为 Pandas 数据框列中的值

python - 使用 PIL 在 Tkinter 中显示动画 GIF

python - 灰度图像不是 jpeg

javascript - 根据字符串中的标点符号将字符串拆分为数组元素 - JavaScript

PYTHON - 从文件中读取单行

Javascript:无法打印由 Object.defineProperty 定义的对象属性