反映出比魔法更大的方法

时间:2015-05-11 22:54:12

标签: python magic-methods

我需要一种反射的魔术方法"大于"并且似乎没有一个。情况就是这样。我有一个跟踪单位的课程。这是财产。我有魔术方法设置来处理比较,但是当我把Property放在右侧时它不起作用。这是一个例子:

class Property():
def __init__(self, input, units):
    self.value = input
    self.units = units


def __gt__(self, other):
    if isinstance(other, Property):
        return self.value.__gt__(other.value)
    else:
        return self.value.__gt__(other)

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

if __name__=='__main__':

    x = Property(1.,'kg')
    y = Property(0.,'kg')
    print y > x
    print float(y) > x
    print y > float(x)

因此,如果你运行它,你将看到输出为:False,True,False,因为中间的例子正在执行float>使用内置的属性>不是>我已经定义了使用魔术方法。我需要一个魔术方法,当属性在右侧时使用。这不是一件事吗?如果没有,我怎么写这个,以便可以比较任何值和我自己的类的组合。我想没有任何比较规则。 IE,我不想永远无法将浮动与房产进行比较。

3 个答案:

答案 0 :(得分:2)

__lt____gt__的对应物;您需要实施__lt__。在您使用它时,您应该实现__le____ge__

答案 1 :(得分:2)

您可以使用functools.total_ordering装饰器为您创建缺少的比较方法:

import functools

@functools.total_ordering
class Property():
    ...

然后你得到假,假,假。但请确保阅读其文档。

答案 2 :(得分:0)

由于您已声明__float__()方法,因此您始终可以将其写为:

print float(y) > float(x)