python - 从类方法调用实例方法,在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 允许从类方法调用实例方法?
解决方案
在 Python 3 中,方法是常规函数对象(不是“未绑定方法”实例),因此它们不检查第一个参数是否是类的实例。
不知道为什么这种变化被认为很重要(可能是均匀性或性能),但您观察到的看起来像是这种选择的不良副作用。
推荐阅读
- javascript - Angular 嵌套 *ngFor / 渲染性能
- google-bigquery - Python Big Query - 能够检查源数据集中是否存在授权视图以及如何删除它
- c# - 控制器测试仅在服务器上失败
- php - PHP邮件不显示正文,头部标签
- swift - 如何使用 Swift 在 Mac OS 的 NSTableView 上禁用可访问性画外音
- sql - 使用 SQL 将列中的值从 PascalCase 更改为 snake_case
- linux-kernel - 软件复用-解复用串口
- python - 创建具有更好性能python的数据集列表列表
- reactjs - 如何将 Redux 应用程序转换为 GraphQL/Apollo?
- python - 如何将单热向量转换为多标签?