2013-05-10 2 views
0

제 질문은 파이썬에서 연산자 오버로딩에 관한 것입니다. 파이썬에서 메서드 호출의 '우선 순위'또는 '순서'를 설정하고 싶습니다. 파이썬 방법을 찾고 있습니다. 아래는 매우 기괴한 예입니다. 그러나 요점을 알려 드릴 것입니다. 파이썬에서 메소드 호출 순서를 변경하는 방법은 무엇입니까?

의 우리가 구문 복사 설탕, 객체를 수정하려면 파이썬에서 __pos____call__ 연산자를 오버로드 할 가정 해 봅시다.

import copy 

class C(object): 
    def __init__(self, **kwargs): 
     self._set(**kwargs) 

    def __call__(self, **kwargs): 
     self._set(**kwargs) 
     return(self) 

    def __pos__(self): 
     return(copy.deepcopy(self)) 

    def _set(self, **kwargs): 
     for keyword, value in kwargs.iteritems(): 
      setattr(self, keyword, value) 

# first case: 
my_obj = C(a=12, b=33, c=55) 
copied = +my_obj(b=77) 
print vars(my_obj), vars(copied) 
# >>> {'a': 12, 'c': 55, 'b': 77} {'a': 12, 'c': 55, 'b': 77} 

# second case: 
my_obj = C(a=12, b=33, c=55) 
copied = (+my_obj)(b=77) 
print vars(my_obj), vars(copied) 
# >>> {'a': 12, 'c': 55, 'b': 33} {'a': 12, 'c': 55, 'b': 77} 

원래 개체가 수정하고 수정 있도록, 첫 번째 경우에, 나중에 다음 __call__ 먼저 호출 방법 및 __pos__을 볼 수있는, 이제 다음은 주요 아이디어에 더미 구현은 개체가 복사되었습니다. 내가 원하는 결과는 두 번째 경우이지만, 먼저 어떤 메소드가 먼저 호출되는지, 어떤 메소드가 후인지를 구분하기 위해 ()을 사용해야했습니다.

내 질문은 : 인스턴스에서 중괄호를 사용하여 연산자 호출을 그룹화하지 않고 클래스에서 이러한 메서드를 호출하는 순서를 어떻게 변경합니까?

미리 감사드립니다.

답변

1

연산자 우선 순위는 언어에 내장되어 있지 않습니다. 나는 이런 식으로 연산자를 오버로드하지 말 것을 제안 할 것이다. 단지 코더를 읽기가 더 어렵게 만든다.

대신에, 나는 최선의 선택을 주장하는 것은 단순히 :

copied = copy.deepcopy(my_obj)(b=77) 

(. 이것은 또한 이상한 보이는 같은 __call__()를 사용하지만, 시나리오에 따라 유효 할 수 있음)

+0

시나리오 것은 아주 간단합니다 : 구조적 계층 구조와 스타일 속성을 정의하는 'python-markup'언어를 만들고 있습니다. 이 시나리오에서는 코드가 작고 읽기 쉽고 편집하기 쉬울 것이므로 위에서 언급 한 것과 같은 것을 작성하는 것이 매우 편리 할 것입니다. 정상적인 상황에서, 당신은 절대적으로 옳습니다 : 명백한 것이 내재적 인 것보다 낫습니다. 그리고 저는이 기본 코드에서 이러한 구문 당을 사용하지 않을 것입니다. –

+0

나는 아직도 나쁜 생각이라고 주장 할 것이다. 실제 Python을 사용하거나 사용자 정의 언어를 사용하십시오. 그렇지 않으면 스타일과 목표의 이상한 혼합으로 끝날 것입니다. 나는 또한 짧은 것은 항상 읽고 편집하기가 더 쉽다는 것에 동의하지 않습니다. –

+0

예 .. 음, 렉서, 파서, 컴파일러, 추가 라이브러리 .. 많은 작업이 있습니다. 이전에 해 보았습니다. 실제로 원하는 것은 마크 업의 단순함과 파이썬의 힘입니다. 그래서이 솔루션을 선택했습니다. –

관련 문제