考虑以下简单代码:
代码a:
class Test:
pass
t = Test()
t.__str__() # 1
t.non_existing_method() # 2
代码b:
class Test(object):
pass
t = Test()
t.__str__() # 1
t.non_existing_method() # 2
为什么在codeA中CPython不抱怨不存在的str方法(当它抱怨2时)?它既不是staticmethod,也不是classmethod。它也不会像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'
在python2.x中,您的案例A将抱怨
__str__
不存在。Test
是一个旧式类(即,它不从object
继承)。你知道吗它们的行为与新样式的类不同,有时是以非直观的方式。这就是为什么现在有了新型的类。你知道吗
在python3.x中,这两个类都是新样式的类,因此都继承自
object
,因此这两个类都没有抱怨,因为object
有一个完全不同的__str__
。你知道吗现在关于IronPython在案例A中没有抱怨,也许它处理方法解析的方式与CPython略有不同。
instance
实际上有一个__str__
方法,IronPython可能会用到这个方法:我不确定这里关于旧式类的CPython行为是规范的,甚至是文档化的,所以IronPython实际上可能没有错。记住,IronPython是Python在.netframework上的重新实现。它不是由最初的Python开发人员开发的。这种与母舰不一致的小边缘情况可能是不可避免的。你知道吗
相关问题 更多 >
编程相关推荐