在Python2.7中创建旧式对象时调用哪些方法?

在Python2.7中创建旧式对象时调用哪些方法?,python,object,methods,python-2.x,Python,Object,Methods,Python 2.x,我正在努力理解在创建旧式对象时调用哪些方法 我做了一些研究,发现这种区别只适用于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 __

我正在努力理解在创建旧式对象时调用哪些方法

我做了一些研究,发现这种区别只适用于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__'

__主类旧类
回溯(最近一次呼叫最后一次):
文件“main.py”,第29行,在
打印(旧。\uuuu初始\uuuu)
AttributeError:OldClass实例没有属性“\uuuu init\uuuuu”
我将继续研究这一主题,以下是一些相关信息的链接:

新样式类与旧样式类:

堆栈溢出新样式与旧样式类:


如果我发现了什么,我会更新帖子,只有在您定义它时才会调用它。因为您没有定义
\uuuu init\uuuu
,所以没有调用它。当它被定义时,它是创建实例的唯一有用的拦截点


新样式类也可以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>来钩住实例构造(与初始化相反),还允许元类((定义
\uuuuu new\uuuuuu
不会改变任何东西,使用元类会隐式地选择新样式的类).

谢谢您的回复@ShadowRanger,我注意到
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu发生了什么。您的第一个输出是由
old=OldStyle()
行触发的(隐式调用
\uuuu init\uuuu
)。再次感谢您的回答:)@ShadowRanger,因此如果我问您在创建旧样式对象时调用哪些方法,那么响应取决于您是否定义了这些方法。例如,如果要创建一个旧式方法,我们不能保证调用了
\uuuuu init\uuuuuu
\uuuuu new\uuuuuuuuu
甚至
\uuuuuuuu-ctor\uuuuuu
方法?到目前为止,我的答案是
\uuuuu init\uuuu
是创建旧式对象时唯一调用的方法,您认为如何?@AxelG.Aguilar:是的,如果我理解正确的话<如果代码>\uuuu init\uuuu
存在,则调用它。对于旧式类的构造/初始化,不会调用任何其他方法。再次感谢@ShadowRanger,因此基本上最终的响应是,当创建旧式对象时,不会调用任何方法。只调用
\uuuu init\uuuu
方法,但前提是它是在旧式对象中定义的,对吗?