为什么CPython允许执行非现有方法

时间:2013-11-06 19:06:18

标签: python

考虑这个简单的代码:

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'

1 个答案:

答案 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开发人员开发的。这种与母舰不一致的小边缘情况可能是不可避免的。