0

考虑这个简单的代码:

代码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 时)?它既不是静态方法也不是类方法。它也不像在codeB中那样从父对象继承。这正如我在 IronPython 中所期望的那样工作(它与 codeA 中的str有关)。

codeB 中,CPython 的行为与我预期的一样——在 #1 的情况下不会抱怨,因为_ str _现在被继承了。

更新:

代码输出(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'
4

1 回答 1

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 是Python 在 .NET 框架上的重新实现。它不是由最初的 Python 开发人员开发的。这种与母舰的微小边缘情况不一致可能是不可避免的。

于 2013-11-06T19:12:03.130 回答