扩展Python内置类:float

4

I would like to change the

float.__str__ 

内置浮点类型的功能(Python 2)

我试图扩展这个类。

class SuperFloat(float):
    def __str__(self):
        return 'I am' + self.__repr__()

然而,当我添加它时,它变成了普通的浮动元素。
egg = SuperFloat(5)
type(egg+egg)

返回浮点数

我的最终目标也是如此

egg += 5

保持超级浮动。
2个回答

6
你需要覆盖你的类型上的“魔法方法”:__add____sub__等。 这里列出了这些方法的列表。 unutbu的回答展示了如何对__add____radd__进行覆盖,但如果你想让你的子类在任何情况下都能替代内置类型,你需要覆盖更多的方法。 这个页面提供了一些简化工作的建议。

引用的页面已经失效。这里提供archive.org的备份或者官方Python归档 - Mohammad Alhashash

5
class SuperFloat(float):
    def __str__(self):
        return 'I am ' + self.__repr__()
    def __add__(self, other):
        return SuperFloat(super(SuperFloat, self).__add__(other))
    __radd__ = __add__

In [63]: type(5+egg)
Out[63]: __main__.SuperFloat

In [64]: type(egg+5)
Out[64]: __main__.SuperFloat

In [65]: type(egg+egg)
Out[65]: __main__.SuperFloat

In [67]: egg += 5

In [69]: type(egg)
Out[69]: __main__.SuperFloat

__radd____add__有什么区别? - TheSoundDefense
1
@TheSoundDefense: 5+egg 调用 (5).__add__(egg),返回 NotImplemented。这导致调用 egg.__radd__(5)。这给了 egg 处理加法的机会。请参见 https://dev59.com/jXNA5IYBdhLWcg3wL6oc。 - unutbu
1
这只会针对 + 的问题进行修复,但从问题描述来看,他想让他的子类在所有操作中“像浮点数一样”,这需要覆盖更多的方法。 - BrenBarn
1
@BrenBarn 也许是这样,但是在学习如何做到这一点时,基本的代码示例可能非常有价值。我特别为 __radd__ = __add__ 给了一个 +1,因为我自己没有想到过这种方法。你给出的答案完全跨越了魔术方法覆盖的基础知识,我觉得这不如这个回答有用。 - TheSoundDefense
@BrenBarn:关于如何更充分地子类化“float”的信息很棒,但我不知道我能做什么。我可以将您的答案并入我的答案中,但我认为这不是礼貌的行为。 - unutbu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接