2015-05-11 3 views
3

Мне нужен метод отраженной магии «больше, чем», и, похоже, он не существует. Вот ситуация. У меня есть класс, который отслеживает единицы. Это свойство вызова. У меня есть метод магического метода для обработки сравнений, но он не работает, когда я помещаю свойство справа. Вот пример:отражено больше, чем магические методы

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, потому что средний пример выполнения поплавок> Свойство, которое использует встроенный> не> Я определил используя магические методы. Мне нужен волшебный метод, который будет использоваться, когда свойство находится справа. Разве это не так? Если нет, как я могу написать это, чтобы можно было сравнить любую комбинацию значений и моего собственного класса. Я бы не хотел иметь никаких правил для сравнений. IE, я не хочу, чтобы просто никогда не смог сравнить float с собственностью.

+0

Будьте осторожны с использованием слова «отражено» для этого, так как Reflection имеет конкретное и несвязанное значение в Computer Science. Возможно, «обратный» был бы лучшим выбором? – IMSoP

+0

@IMSoP В документах Python используется фраза «отраженные операнды» здесь: https://docs.python.org/3/reference/datamodel.html#object.__radd__ Конечно, это другой случай, потому что у операторов упорядочения нет [коммутативное свойство] (http://en.wikipedia.org/wiki/Commutative_property). Тем не менее, я бы не сказал, что это полностью не связано со словом «отражено» в смысле «оглянуться назад», которое используется в выражениях типа «a op b», где метод op объекта a не может обрабатывать объект b. – Shashank

+0

Ах, справедливо. Тогда у кого-то плохого выбора слова, а не твоего, и слишком поздно, чтобы исправить это сейчас. :) – IMSoP

ответ

1

Вы можете использовать functools.total_ordering декоратора, чтобы создать недостающие методы сравнения для вас:

import functools 

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

Тогда вы получаете False, False, False. Однако не забудьте прочитать его документацию.

+0

Это отлично работает! Хотя, документация делает это показаться довольно волшебным, я понятия не имею, что это действительно делает. Но я думаю, что это жизнь! – Murenrb

+0

Чтобы посмотреть, что он на самом деле делает, просто взгляните на [источник] (https://github.com/python/cpython/blob/master/Lib/functools.py#L192) :-) –

2

__lt__ является __gt__; вам нужно будет реализовать __lt__. В то время как вы на нем, вы, вероятно, должны реализовать __le__ и __ge__.

+0

Это именно то, чего я хочу избежать. У меня все это реализовано, но я не хочу, чтобы было произвольное правило, что мой собственный класс может идти только с левой стороны оператора. Я не единственный, кто будет использовать этот класс, чтобы он был надежным. Это не сработает. – Murenrb

+0

@Murenrb: Нет, это сработает. Фактически, это именно то, что «functools.total_ordering» делает для вас, хотя этот метод имеет несколько осложнений. – user2357112

0

Поскольку вы объявили метод __float__(), вы всегда можете написать:

print float(y) > float(x) 
Смежные вопросы