我有时希望将对象视为数字。这就是我的工作:
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"部分。实际上,可以定义每个可能的运算符,这提供了很大的灵活性,但也非常冗长。似乎只有在定义了所有相关运算符时才可能进行自动隐式转换。有没有办法让这个更简洁?
答案 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__
。见here。 This也会很方便。
解决方案可能类似于
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