在Python中重载*运算符(或模拟它)

3
我想在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
你可以通过重载__iter__来实现你想要的功能,但这会影响到对象的任何迭代。 - Joe Kington
4
函数调用和定义中参数名前的 *** 语法并不被视为运算符,不能进行重载。(你为什么想要这样做?) - Wooble
你想要“重载运算符”的对象是什么?目的是什么?你能给出一个使用案例吗? - Karl Knechtel
2个回答

6

我认为您没有正确理解一元运算符***

它们将列表/字典展开成函数参数/关键字参数。在这个上下文中,没有其他意义。因此,它们不能被重载。

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


7
实际上,在至少另外一个地方可以使用“*”:在Python 3中,您可以编写a, *b = 1,2,3来将a设置为1,将b设置为[2,3]。有点泛化,我承认。 - DSM

0

你的意思是

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

    def deref(self):
        return self.pointee

这不是你想要的吗?

您能否更具体地说明使用*ptr编写的优势是什么,而不是上面定义的ptr.deref()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接