当我将代码库从Python 3.7.5更新到3.10时,我遇到了一些问题. 据我所知,继承应该有从左到右的顺序,这意味着如果你从两个类继承,那么它应该使用左类方法.在Python 3.7.5中也是这样,但是在Python 3.10中,如果你首先继承int或float,然后你向继承列表中添加第二个类(在我的例子中是Base),那么它将使用Base的__str__方法,而__repr__方法会按预期工作.

我是不是遗漏了什么?这是个窃听器吗?

class Base:
    def __str__(self) -> str:
        return 'Base'
    
    def __repr__(self) -> str:
        return 'Base'
    
class Integer(int, Base):
    def __new__(cls, value):
        return int.__new__(cls, value)

class String(str, Base):
    def __new__(cls, value):
        return str.__new__(cls, value)  

print(f"str: {Integer(2)} and {String(2)}")
print(f"repr: {repr(Integer(2))} and {repr(String(2))}")

在Python3.7.5中,它打印:

str: 2 and 2
repr: 2 and '2'

在Python3.10和3.11中,它打印:

str: Base and 2
repr: 2 and '2'

推荐答案

您的Integer类的MRO为(Integer, int, Base, object),优先于在int中定义的方法,而不是在Base中定义的方法,但int实际上并没有定义__str__.它定义了__repr__,但它继承了object.__str__.它看起来只是定义了__str__,因为object.__str__代表__repr__,而__repr__int定义的.

因此,如果您调用str(Integer(2)),它在Integerint中找不到实现.它找到的第一个实现是Base.__str__,返回'Base'.

在Python 3.7.5上,行为是不同的,因为在较新的Python版本中,当格式规范为空时,int.__format__调用str(self).在旧版本中,它使用一个单独的格式化实现,该实现不会调用您定义的任何方法.

Python相关问答推荐

当多个值具有相同模式时返回空

将整组数组拆分为最小值与最大值之和的子数组

标题:如何在Python中使用嵌套饼图可视化分层数据?

图像 pyramid .难以创建所需的合成图像

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

计算组中唯一值的数量

如何过滤包含2个指定子字符串的收件箱列名?

如何在Python脚本中附加一个Google tab(已经打开)

将tdqm与cx.Oracle查询集成

如何创建一个缓冲区周围的一行与manim?

python中的解释会在后台调用函数吗?

Django—cte给出:QuerySet对象没有属性with_cte''''

如何使regex代码只适用于空的目标单元格

dask无groupby(ddf. agg([min,max])?''''

为什么常规操作不以其就地对应操作为基础?

如何在Python请求中组合多个适配器?

以异步方式填充Pandas 数据帧

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

如何删除重复的文字翻拍?

一个telegram 机器人应该发送一个测验如何做?""