python中的重载*运算符(或模拟它)

时间:2012-03-15 14:52:35

标签: python overloading operator-keyword unpack

我想在python中重载*运算符。在C ++中,您可以重新设置取消引用运算符,以便您可以使用自定义方式创建一个类来响应*alpha

这个问题的一部分是我完全不知道,我的意思是,*运算符(我称之为解包运算符)的作用是什么。

那么如何重载它,或模拟它的重载。

最终我希望能够:*alpha使用自定义响应和返回值。


编辑:

感谢Joe Kington的评论,我找到了解决方案。由于*alpha根据__iter__解包,所以我定义了一个可以继承的简单类来允许这个。

顺便说一句,我希望能够做到这一点的原因是因为我想要一个漂亮的界面。

class Deref:
  def __deref__(self):
    pass

  def __iter__(self):
    yield self.__deref__()

class DerefTest(Deref):
  def __deref__(self):
    return '123cat'

if __name__ == '__main__':
  print(*DerefTest()) # prints '123cat'

最后我决定使用另一个一元运算符,因为我给出的实现在所有情况下都不起作用,所以我很失望。

2 个答案:

答案 0 :(得分:6)

我认为你没有正确理解一元***“运算符”。

他们将list / dict解包为函数参数/关键字参数。在这种情况下没有其他任何有意义的东西。因此,它们不能超载。

实际上,使用它们是语法错误,但在函数声明/调用中。

答案 1 :(得分:0)

你的意思是

class Pointer(object):
    def __init__(self, pointee):
        self.pointee = pointee

    def deref(self):
        return self.pointee

不是你想要的?

您是否可以更具体地说明*ptr的写作优势,而不是上面定义的ptr.deref()