在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实施。
我不认为你正确理解了一元*
和**
“操作符”。
他们将一个列表/字典解压缩到函数参数/关键字参数中。在这种情况下没有任何其他意义。因此,它们不能超载。
实际上,使用它们是任何地方的语法错误,但在函数声明/调用中。
其实你至少可以在其他地方使用*:在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()
?
你应该能够通过重载__iter__来做你想要的,尽管这会影响你对象的任何迭代。 – 2012-03-15 14:58:56
函数调用和定义中的参数名称之前的'*'和'**'语法不被视为运算符,本身并且不能被重载。 (为什么你想这样做?) – geoffspear 2012-03-15 14:58:57
你想“超载操作员”的事情是什么?出于什么目的?你能举一个例子用例吗? – 2012-03-15 18:35:38