如何在Python中将对象视为数字类型

时间:2014-02-26 07:28:36

标签: python casting

我有时希望将对象视为数字。这就是我的工作:

class C(object):
def __init__(self):
    self.a = 1.23
    self.b = 'b'        

def __float__(self):
    return float(self.a)

c = C()

明确的施法作品:

works = float(c) + 3.141
correct_comparison = (float(c) < 1)
>>> correct_comparison
False

但是,自动(隐式)转换不起作用

wrong_comparison = (c < 1)
>>> wrong_comparison
True

doesnt_work = c + 2.718 #TypeError exception is thrown

有没有办法在Python中执行自动转换。这个想法有多糟糕?

更新 @BrenBarn向我指出了Python文档中的"emulating numeric types"部分。实际上,可以定义每个可能的运算符,这提供了很大的灵活性,但也非常冗长。似乎只有在定义了所有相关运算符时才可能进行自动隐式转换。有没有办法让这个更简洁?

2 个答案:

答案 0 :(得分:3)

正如@BrenBarn所说,你可以使用继承:

class SomeFloat(float):
    def __init__(self, *args):
        super(float, self).__init__(*args)
        self.b = 'b'

它不会那么冗长。

答案 1 :(得分:1)

这不是Python对对象的看法。将C转换为浮点值几乎没有价值,因为Python通常不关心对象,而是对象的行为。您应该实现自定义比较功能,例如__lt____eq__。见hereThis也会很方便。

解决方案可能类似于

import functools

@functools.total_ordering
class C(object):

    def __init__(self):
        self.a = 1.2345

    def __float__(self):
        return float(self.a)

    def __eq__(self, other):
        return self.a == float(other)

    def __lt__(self, other):
        return self.a < float(other)

c = C()
assert c < 3.14
assert 3.14 > c
assert c == 1.23456
assert 1.23456 == c
assert c != 1