在 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类 隐式选择新式 类).
我很难理解在创建旧式对象时调用了哪些方法。
做一点研究我发现这种区别仅适用于 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类 隐式选择新式 类).