在 Python 2.7 中创建旧式对象时会调用哪些方法?

Which methods are called when an old-style object is created in Python 2.7?

我很难理解在创建旧式对象时调用了哪些方法。

做一点研究我发现这种区别仅适用于 python 2.7 而不适用于 python 3,但是,我正在测试代码中的方法:

class OldClass():
    pass

class NewClass(object):
    pass

old = OldClass()
new = NewClass()

print(type(old))
print(type(new))
print(old.__class__) #It retrieves __main__
print(old.__new__)  #Never called
print(old.__init__) #Never called

这是输出:

<type 'instance'>
<class '__main__.NewClass'>
__main__.OldClass
Traceback (most recent call last):
File "main.py", line 29, in <module>
print(old.__init__)
AttributeError: OldClass instance has no attribute '__init__'

我正在继续研究这个主题,这里有一些相关信息的链接:

新样式 class 与旧样式:https://www.youtube.com/watch?v=KwpnXqnVx2o

堆栈溢出新风格与旧风格class:What is the difference between old style and new style classes in Python?

如果我发现了什么,我会更新 post

__init__ 仅存在,并且仅在定义 时才被调用 。由于您没有定义 __init__,因此不会调用它。当它被定义时,它是创建实例的唯一有用的拦截点,并且 most of what you're trying to do works fine.

新式 类 也可以使用 __new__ 挂钩实例构造(与初始化相反),并且还允许元 类 (它可以挂钩更疯狂的东西方式),但它们不适用于旧式 类(定义 __new__ 不会改变任何东西,使用 meta类 隐式选择新式 类).