【问题标题】:python __lt__ __gt__ custom (overloaded) operatorspython __lt__ __gt__ 自定义(重载)运算符
【发布时间】:2016-06-14 13:58:21
【问题描述】:

用 Python 做实验后,我来到了代码:

class Chainable(object):
    value = []
    def __init__(self,*args):
        self.value = []
        for a in args:
            if isinstance(a,list):
                self.value += a
            elif isinstance(a,tuple):
                self.value += list(a)
            else: 
                self.value += [a]
        return 

    def __lt__(self,a):
        self.value = [a]+self.value
        return self
    def __gt__(self,a):
        self.value = self.value+[a]
        return self
    def __or__(self,x):
        self.value += [x]
        return self

当我运行这样的代码时:

a = Chainable(1,2,3)

我可以问:a | 4 | 5 并以[1,2,3,4,5] 接收结果。

但是当我要求a > 4 > 5 时,我得到的只是Falsea = [1,2,3,4]

你能指点一下运算符排序表吗?

【问题讨论】:

  • a > 4 > 5a > 4 and 4 > 5,而4 明显小于5。你期待什么答案?见docs.python.org/2/reference/expressions.html#not-in
  • 结果是可以理解的,但与|相同的代码工作。
  • ...是吗? | 不是比较运算符,因此不调用链接,但 > 是。
  • 其他运算符也不只是"从左到右的顺序";还有precedence rules
  • 是的,我明白这一点,但是使用比较运算符来定义您自己的语法只会让其他尝试使用您的代码的人感到困惑。也许坚持使用移位运算符<<>>,它们的行为更接近您的预期?

标签: python overloading operator-keyword


【解决方案1】:

得到的解决方案(感谢jonrsharpe):

class Chainable(object):
    value = []
    def __init__(self,*args):
        self.value = []
        for a in args:
            if isinstance(a,list):
                self.value += a
            elif isinstance(a,tuple):
                self.value += list(a)
            else: 
                self.value += [a]
        return 

    def __lshift__(self,a):
        self.value = [a]+self.value
        return self
    def __rshift__(self,a):
        self.value = self.value+[a]
        return self
    def __or__(self,x):
        self.value += [x]
        return self

一个操作会是这样的:

a = Chainable(1,2,3)
a << 0 << -1 >> 4 >> 5
[-1,0,1,2,3,4,5]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多