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

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

问题描述:

我想在python中重载*运算符。在C++中,可以重载解引用操作符,以便您可以使用自定义方式创建类以响应*alpha在python中重载*运算符(或模拟它)

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

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

最终我希望能够做到:*alpha具有自定义响应和返回值。


编辑:

我找到了解决办法感谢乔金顿的评论。由于*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' 

最后,我只是看中了使用其它一元运算符,因为我给了在所有情况下不能正常工作,所以我dissapoint实施。

+2

你应该能够通过重载__iter__来做你想要的,尽管这会影响你对象的任何迭代。 – 2012-03-15 14:58:56

+4

函数调用和定义中的参数名称之前的'*'和'**'语法不被视为运算符,本身并且不能被重载。 (为什么你想这样做?) – geoffspear 2012-03-15 14:58:57

+0

你想“超载操作员”的事情是什么?出于什么目的?你能举一个例子用例吗? – 2012-03-15 18:35:38

我不认为你正确理解了一元***“操作符”。

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

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

+7

其实你至少可以在其他地方使用*:在Python 3中,你可以编写'a,* b = 1,2,3'将a设置为1,将b设置为[2,3]。我承认,这是一种泛化。 – DSM 2012-03-15 15:03:07

你的意思是

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

    def deref(self): 
     return self.pointee 

是不是你想要的?

请问您是否更具体的写作*ptr的优势是什么,而不是上面定义的ptr.deref()