Python 反映出比魔法更伟大的方法
我需要一个反射魔法方法“大于”,但似乎没有。情况是这样的。我有一门课,它记录单位。这是呼叫属性。我设置了magic方法来处理比较,但是当我将属性放在右边时,它就不起作用了。以下是一个例子:Python 反映出比魔法更伟大的方法,python,magic-methods,Python,Magic Methods,我需要一个反射魔法方法“大于”,但似乎没有。情况是这样的。我有一门课,它记录单位。这是呼叫属性。我设置了magic方法来处理比较,但是当我将属性放在右边时,它就不起作用了。以下是一个例子: class Property(): def __init__(self, input, units): self.value = input self.units = units def __gt__(self, other): if isinstance(other, Prope
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>属性,该属性使用内置>而不是我使用magic方法定义的>。我需要一个神奇的方法,将使用时,属性是在右手边。这不是一件事吗?如果不是的话,我该如何写这篇文章,以便可以比较任何值的组合和我自己的类。我不想有任何比较规则。也就是说,我不想永远无法将浮动与财产进行比较
\uuult\uuuuu
是\uugt\uuuu
的对应物;您需要实现\uuult\uuuuu
。当您进行此操作时,您可能应该实现\uuuu le\uuuuu
和\uuu ge\uuuu
,因为您已经声明了\uu float\uuuu()
方法,所以您可以将其编写为:
print float(y) > float(x)
您可以使用装饰器为您创建缺少的比较方法:
import functools
@functools.total_ordering
class Property():
...
然后你会变假,假,假。不过,一定要阅读它的文档。要小心使用“反射”这个词,因为反射在计算机科学中有一个特定而无关的含义。也许“反向”会是一个更好的选择?@IMSoP Python文档在这里使用短语“反射操作数”:当然,这是另一种情况,因为排序运算符没有相同的值。尽管如此,我不会说这与“回顾”意义上的“反射”一词完全无关,这个词在
a op b
这样的表达式中使用,其中对象a的op方法不能处理b类型的对象。啊,很公平。其他人用词不当,而不是你的,那么,现在修复它已经太迟了是的,我是这方面的专家。我只是一个卑微的机械工程师。我只是用了一个词,这个词的意思似乎和我的意思一样,基于现有的命名法:这正是我想要避免的事情。我已经实现了所有这些,但我不希望有一个任意的规则,即我自己的类只能位于操作符的左侧。我不是唯一一个会使用这个类的人,所以它需要健壮。这行不通。@Murenrb:不,行不通。事实上,这正是functools.total_ordering
为您所做的,尽管这种方法有一些复杂之处。这非常有效!虽然文档让它看起来很神奇,但我不知道它到底在做什么。但我想这就是生活!好吧,看看它到底在做什么,看看:-)