首页 > 解决方案 > 从类方法调用实例方法,在python3中允许,在python 2中不允许?

问题描述

以下代码片段在 python2 中给出错误,但在 python3 中没有错误

class Steps(object):
    def step(self, msg="Default"):
        if not hasattr(self, "funky_attr"):
            print('No attr')
        print(self)
        print(msg)

class FirstTest(Steps):
    @classmethod
    def test_setup(cls):
      cls.step("This is the message")

if __name__ == '__main__':
    C = FirstTest()
    C.test_setup()

使用 python 2 它会产生错误:

TypeError:必须使用 CifsTest 实例作为第一个参数调用未绑定的方法 step()(改为获取 str 实例)

虽然使用 python 3 它运行良好:

无属性

这是消息 # 注意这里的 'self' 是 str

默认

这是正确的行为吗?

Python3 允许从类方法调用实例方法?

标签: pythonpython-3.xpython-2.7class-method

解决方案


在 Python 3 中,方法是常规函数对象(不是“未绑定方法”实例),因此它们不检查第一个参数是否是类的实例。

不知道为什么这种变化被认为很重要(可能是均匀性或性能),但您观察到的看起来像是这种选择的不良副作用。


推荐阅读