如何检测我的Python类实例是被转换成整数还是浮点数?

2 投票
2 回答
595 浏览
提问于 2025-04-17 02:12

我有一个Python类,用来计算以“Kb”、“Mb”或“Gb”表示的位数。我给这个类的bits()方法加了一个@property,这样它总是返回一个float类型的数(这也让int(BW('foo').bits)能正常工作)。

不过,我现在遇到一个问题,就是当我把这个类的实例直接转换成int()时,比如int(BW('foo')),我不知道该怎么处理。我已经定义了__repr__()方法来返回一个字符串,但在转换类型的时候,这段代码似乎没有被调用。

有没有办法让我在类里面检测到它正在被转换成其他类型(这样我就可以处理这种情况)呢?

>>> from Models.Network.Bandwidth import BW
>>> BW('98244.2Kb').bits
98244200.0
>>> int(BW('98244.2Kb').bits)
98244200
>>> BW('98244.2Kb')
98244200.0
>>> type(BW('98244.2Kb'))
<class 'Models.Network.Bandwidth.BW'>
>>>
>>> int(BW('98244.2Kb'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'BW'
>>>

2 个回答

2

简单来说,你想要的功能可以通过重写 __trunc____float__ 这两个方法来实现,这些方法是在 Models.Network.Bandwidth.BW 这个类里面的:

#!/usr/bin/python

class NumBucket:

    def __init__(self, value):
        self.value = float(value)

    def __repr__(self):
        return str(self.value)

    def bits(self):
        return float(self.value)

    def __trunc__(self):
        return int(self.value)

a = NumBucket(1092)
print a
print int(a)
print int(a.bits())

撰写回答