2013-06-11 3 views
0

클래스에 속성으로 배열이 있습니다. 나는 같은 속성에 다른 방법으로 값을 할당 할 세터 장식을 사용 : 번호가 할당 된 경우에 따라서python의 오버로드 설정자 데코레이터

class MyClass: 

    def __init__(self): 
     self._x=[0,0,0,0] 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = [value,value,value,value] 

    @x.setter 
    def x(self, value1,value2): 
     self._x[0] = value1 
     self._x[3] = value2 

, 모든 요소는 두 개의 번호가 할당 된 경우, 내가 첫 번째 및 변경, 변경 마지막 것. 그것을하는 적당한 방법다는 것을?

+0

코드를 줄이려면 기본 인수 값을 사용할 수 있습니다. 예제,'def x (self, value1, value2 = None)' – karthikr

답변

3

파이썬은 오버로드를 지원하지 않으므로, 오버로드를 지원하지 않습니다. 대신 기본값을 사용하면 일반적으로 사용 키워드 매개 변수 : 그러나

def x(self, value1, value2=None): 
    if value2 is None: 
     self._x = [value1] * 4 
    else: 
     self._x[0] = value1 
     self._x[3] = value2 

, 속성에 세터은 오직 하나 인수 값을 가져; 대신에 시퀀스를 통과하는 것을 감지해야합니다.

@x.setter 
def x(self, value): 
    if not isinstance(value, tuple): 
     self._x = [value] * 4 
    else: 
     if len(value) == 2: 
      # use indices 0 and 1, rest is discarded? 
      self._x[0], self._x[3] = value[0], value[1] 
     elif len(value) == 4 
      self._x = value 
     else: 
      raise ValueError('Can only set x to a single value, or a tuple of length 2 or 4') 
+0

'Ellipsis'를 센티넬 (sentinel)으로 사용할 수도 있습니다. 표준 파이썬에는 사용되지 않으며 독창적 인 싱글 톤입니다. – Antimony

+0

@Antimony : 물론 이죠. 그러나 그것은 현명한 문서화를 추가하지 않으며 실제로 혼란을 야기 할뿐입니다. 나는 오히려 명백한 감시병을 선언한다. –

+0

답변 해 주셔서 감사합니다. – freude

2

파이썬에는 서명에 기반한 오버로딩 기능에 대한 개념이 없습니다. 그렇게하고 싶다면, 함수 안에서 수행해야합니다. 이런 식으로 할 수 있습니다.

@x.setter 
def x(self, value, *args): 
    if args: 
     self._x[0] = value 
     self._x[3] = args[0] 
    else: 
     self._x = [value,value,value,value] 
+0

이것은 속성의 설정자로 작동하지 않을 것이라고 생각합니다. 당신은'value'를보고 그것이 튜플인지 알맞게 반응해야합니다. – mgilson

+0

@mgilson, 아, 저는 속성이 어떻게 작동하는지 잘 모릅니다. 나는 OP에서 코드 샘플을 보러 갔다. – Antimony