考虑这个简单的代码:
CODEa所:
class Test:
pass
t = Test()
t.__str__() # 1
t.non_existing_method() # 2
codeB :
class Test(object):
pass
t = Test()
t.__str__() # 1
t.non_existing_method() # 2
为什么在 codeA 中CPython没有抱怨不存在的 _ str _ 方法(当它抱怨#2时)?它既不是静态方法也不是类方法。它也不会像在 codeB 中那样从父对象继承。这符合我在IronPython中的预期(它在codeA中得到了 str )。
在 codeB 中,CPython表现得像我期望的那样 - 在#1> _ str _ 现在继承的情况下不会抱怨。
更新
codeA输出(CPython):
Traceback (most recent call last):
File "C:\eclipse_workspace\py_test\src\test_module.py", line 6, in <module>
t.non_existing_method() # 2
AttributeError: 'Test' object has no attribute 'non_existing_method'
答案 0 :(得分:4)
在Python 2.x中,您的案例A会抱怨__str__
不存在。 Test
是一个旧式的类(即它不会继承自object
)。
>>> print type(t)
<type 'instance'>
这些行为与新式类不同,有时以非直观的方式。这就是现在有新式课程的原因之一。
在Python 3.x中,两者都是新式的类,因此继承自object
,所以既没有抱怨,因为object
具有完美的cromulent __str__
。
现在关于IronPython在案例A中没有抱怨,也许它处理方法解决方案与CPython的方式略有不同。 instance
实际上有一个__str__
方法,IronPython可能会采用这种方法:
>>> print type(t).__str__
<slot wrapper '__str__' of 'object' objects>
我不确定这里关于旧式类的CPython行为是规范的还是记录的,所以IronPython可能实际上并没有错。请记住,IronPython是.NET框架上Python的重新实现。它不是由原始Python开发人员开发的。这种与母舰不一致的小边缘情况可能是不可避免的。