操纵Python魔术方法

时间:2018-08-25 01:05:10

标签: python class methods

我对数据科学图书馆或从类中调用方法和属性有更多的了解。我正在尝试使用魔术方法。我很难获得bool类型并返回它们的对立面。

我对strdatetime对象执行了某些操作,但对__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 > ba < ba == b的内容,并返回相反的布尔值TrueFalse,如下所示:练习。

我尝试了几种方法,例如将方法放置在我创建的__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 :(得分:1)

如果您要返回比较得出的布尔值的取反,则可以执行类似的操作

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中,您使用的是int类的__lt__方法。