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'

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

4

2 回答 2

6

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

他们将列表/字典解压缩为函数参数/关键字参数。在这种情况下,没有其他任何意义。因此,它们不能超载。

实际上,在函数声明/调用之外的任何地方使用它们都是语法错误。

于 2012-03-15T14:58:00.870 回答
0

你的意思是

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

    def deref(self):
        return self.pointee

是不是你想要的?

您能否更具体地说明按原样编写*ptr而不是ptr.deref()上面定义的优势?

于 2012-03-15T15:16:41.900 回答