Манипулирование магическими методами Python - PullRequest
0 голосов
/ 25 августа 2018

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

Я сделал что-то с str и datetime объектами, которые работали, но, похоже, не работали с __cmp__, __lt__, __eq__ или ` gt ».Вот мой код:

class Opposite:

    def __cmp__(self, other):

        if other.__class__.__name__ == 'bool':
            return other

    def __lt__(self, other):
        if other.__class__.__name__ == 'bool':
            return other

    def __eq__(self, other):
        if other.__class__.__name__ == 'bool':
            return other

    def __gt__(self, other):
        if other.__class__.__name__ == 'bool':
            return other


if __name__=="__main__":

    """ test class Compare """

    a = 1
    b = 1
    c = a < b
    d = a > b
    e = a == b

print("Results:\na\t{}\nb\t{}\nc\t{}\nd\t{}\ne\t{}\n".format(a,b,c,d,e))
print("\nType:\na-type\t{}\nb-type\t{}\nc-type\t{}\nd-type\t{}\ne-type\t{}\n"
      .format(type(a),type(b),type(c),type(d),type(e)))

Это печатает следующее:

Results:
a   1
b   1
c   False
d   False
e   True

Type:
a-type  <class 'int'>
b-type  <class 'int'>
c-type  <class 'bool'>
d-type  <class 'bool'>
e-type  <class 'bool'>

Как видите, результаты такие же, как и при отсутствии использования класса вообще.Я добавил __init__ метод для печати using Opposite, и он только печатает, что если я создаю экземпляр объекта с чем-то вроде a = Opposite().

, я бы хотел ввести что-то вроде a > b, a < b,или a == b и верните противоположное логическое значение, True или False, в качестве упражнения.

Я пробовал несколько вещей, таких как помещение методов в созданный мной метод __init__, который тоже не работал.Я читал об этом и до сих пор не совсем понимаю, как это сделать с логическими, целыми числами и числами с плавающей точкой.Методы, описанные выше, позволяют мне преобразовывать объекты даты и времени в строки с помощью методов __add__, __radd__ и __rsub__.

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ

Благодаря вашей помощи у меня появилось лучшее понимание, и я завершил небольшой эксперимент с этим кодом:

class Opposite:

    def __init__(self, x):
        self._x = x

    def __lt__(self, other):
        return not self._x < other._x

    def __eq__(self, other):
        return not self._x == other._x

    def __gt__(self, other):
        return not self._x > other._x

    def __le__(self, other):
        return not self._x <= other._x

    def __ge__(self, other):
        return not self._x >= other._x

def tester(w, x, y, z):
    try:
        # Original values
        a = w < x
        b = w > x
        c = w == x
        d = w <= x
        e = w >= x

        # Opposite values
        f = y < z
        g = y > z
        h = y == z
        i = y <= z
        j = y >= z

        # Results
        k = 'Fail' if a == f else 'Success'
        l = 'Fail' if b == g else 'Success'
        m = 'Fail' if c == h else 'Success'
        n = 'Fail' if d == i else 'Success'
        o = 'Fail' if e == j else 'Success'

        print('\nComparing {} and {}:\t<\t>\t==\t<=\t>='.format(w, x))
        print('Original Values:', end='\t')
        print('{0}\t{1}\t{2}\t{3}\t{4}'.format(a, b, c, d, e))
        print('Opposite Values:', end='\t')
        print('{0}\t{1}\t{2}\t{3}\t{4}'.format(f, g, h, i, j))
        print('Comparisons:', end='\t')
        print('\t{0}\t{1}\t{2}\t{3}\t{4}'.format(k, l, m, n, o))

    except(Exception) as err:
        print(err)

if __name__=="__main__":

    """ test class Compare """

    a = 1
    b = 2
    c = Opposite(a)
    d = Opposite(b)
    tester(a, b, c, d)

Эта печатьследующее:

Comparing 1 and 2:  <   >   ==  <=  >=
Original Values:    True    False   False   True    False
Opposite Values:    False   True    True    False   True
Comparisons:        Success Success Success Success Success

1 Ответ

0 голосов
/ 25 августа 2018

Если вы имеете в виду, что хотите вернуть отрицание логического значения, полученного в результате сравнения, вы можете сделать что-то вроде

class T:
    def __init__(self, x):
        self._x = x

    def __lt__(self, other):
        return not self._x < other._x

t1 = T(1)
t2 = T(2)

print(t1 < t2) #False

Обратите внимание, что в сравнении self._x < other._x вы используете метод __lt__ класса int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...