2012-03-15 4 views
3

파이썬에서 * 연산자를 오버로드하고 싶습니다. C++에서는 참조 연산자를 오버로드하여 *alpha에 응답하는 사용자 정의 방법으로 클래스를 만들 수 있습니다.Python에서 오버로드 * 연산자 (또는 에뮬레이션)

이 질문의 일부는 정확히 알지 못합니다. 정확히 말하면 * 연산자 (내가 호출 할 때 연산자를 풀음)가 의미하는 바가 있습니다.

어떻게 오버로드 할 수 있습니까? 아니면 과부하를 에뮬레이트 할 수 있습니까?

궁극적으로 나는 사용자 정의 응답 및 반환 값이있는 *alpha을 수행 할 수 있기를 원합니다.


편집 :

I 조 킹톤의 의견에 대한 해결책 덕분에 발견했다. *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__'을 오버로드하여 원하는 작업을 수행 할 수 있어야합니다. 그러나 이는 개체를 반복 할 때 영향을줍니다. –

+4

함수 호출 및 정의에서 매개 변수 이름 앞에있는'*'및'**'구문은 연산자 자체로 간주되지 않으므로 오버로드 할 수 없습니다. (왜 이것을하고 싶습니까?) – geoffspear

+0

"과부하"하고 싶은 것은 무엇입니까? 무슨 목적을 위해? 예제 유스 케이스를 제공 할 수 있습니까? –

답변

5

단 하나의 *** "연산자"를 올바르게 이해했다고 생각하지 않습니다.

목록/dict를 함수 인수/키워드 인수에 압축을 풉니 다. 이러한 맥락에서 의미있는 것은 없습니다. 따라서 과부하가 걸리지 않습니다.

사실, 이들을 사용하는 것은 함수 선언/호출 어디서나 구문 오류입니다.

+7

사실 적어도 하나 이상의 다른 장소에서 * 사용할 수 있습니다 : 파이썬 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.deref() 대신에 *ptr으로 작성하면 어떤 이점이 있는지 구체적으로 설명 할 수 있습니까?