为什么CPython允许执行不存在的方法

2024-06-29 01:09:22 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下简单代码:

代码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'

Tags: 代码pytestobjectpasscpythonmethodclass
1条回答
网友
1楼 · 发布于 2024-06-29 01:09:22

在python2.x中,您的案例A将抱怨__str__不存在。Test是一个旧式类(即,它不从object继承)。你知道吗

>>> print type(t)
<type 'instance'>

它们的行为与新样式的类不同,有时是以非直观的方式。这就是为什么现在有了新型的类。你知道吗

在python3.x中,这两个类都是新样式的类,因此都继承自object,因此这两个类都没有抱怨,因为object有一个完全不同的__str__。你知道吗

现在关于IronPython在案例A中没有抱怨,也许它处理方法解析的方式与CPython略有不同。instance实际上有一个__str__方法,IronPython可能会用到这个方法:

>>> print type(t).__str__
<slot wrapper '__str__' of 'object' objects>

我不确定这里关于旧式类的CPython行为是规范的,甚至是文档化的,所以IronPython实际上可能没有错。记住,IronPython是Python在.netframework上的重新实现。它不是由最初的Python开发人员开发的。这种与母舰不一致的小边缘情况可能是不可避免的。你知道吗

相关问题 更多 >