从 class 方法调用实例方法,在 python3 中允许,在 python 中不允许 2?

Calling instance method from class method, allowed in python3, disallowed in 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: unbound method step() must be called with CifsTest instance as first argument (got str instance instead)

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

No attr

This is the message # Note here the 'self' is the str

Default

这是正确的行为吗?

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

在 Python 中,3 个方法是常规函数对象(不是 "unbound method" 实例),因此它们不检查第一个参数是否是 class.[=10 的实例=]

不确定为什么认为此更改很重要(可能是均匀性或性能),但您观察到的情况看起来像是此选择的不良副作用。