Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反映出比魔法更伟大的方法_Python_Magic Methods - Fatal编程技术网

Python 反映出比魔法更伟大的方法

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

我需要一个反射魔法方法“大于”,但似乎没有。情况是这样的。我有一门课,它记录单位。这是呼叫属性。我设置了magic方法来处理比较,但是当我将属性放在右边时,它就不起作用了。以下是一个例子:

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
为您所做的,尽管这种方法有一些复杂之处。这非常有效!虽然文档让它看起来很神奇,但我不知道它到底在做什么。但我想这就是生活!好吧,看看它到底在做什么,看看:-)