2016-11-22 1 views
0

tuple 래퍼 클래스를 만들었습니다. 튜플은 항목 변경을 지원하지 않습니다. __setitem____delitem__ 구현을 남겨 두거나 다음과 같은 메소드를 구현해야합니까? 아래 (따라서 거절 된 유증스러운 코드 냄새가 나옴)? 어떤 방법이 더 파이썬인가? 이 경우 사용자 정의 예외가 더 좋지 않습니까?Python : 사용해서는 안되는 마법 방법

def __setitem__(self, key, value): 
    """ 
    :raise: Always. 
    :raises: TypeError 
    """ 
    self.data_set[key] = value # Raise from tuple. 

def __delitem__(self, key): 
    """ 
    :raise: Always. 
    :raises: TypeError 
    """ 
    raise TypeError("Item deletion is unsupported") # Custom exceptions thrown. 

답변

1

클래스가 적절한 튜플 하위 유형 (Liskov substitution principle에 따라)으로되어있는 경우, 튜플 wrt/set/del - 같은 방법으로 Guillaume 언급 한대로 __setitem__ 또는 __delitem__ 정의하는 경우 기본 동작입니다. 나는 그것이 "거절 된 유증"범주에 빠지는 것을 보지 못합니다.

클래스가 구현의 일부로 튜플을 사용하지만 적절한 튜플 하위 유형이 아닌 것으로 가정하면 어떤 것이 든 의미가 있습니다.하지만 항목 할당/삭제를 허용하지 않으려면 다시 가장 간단한 방법입니다 그들을 구현하지 않는 것입니다.

+0

거절 된 Bequest에 의해 나는이 클래스가'__setitem__'과'__delitem__'을 구현한다고 주장하지만, 그 행동은 그 작업을 지원하지 않는다는 것을 보여줍니다. – JCode

+1

AOK. 실제로 (내가 언급 한 것처럼) 목표가 항목 할당과 삭제를 지원하지 않는다면, 실제로는 이러한 방법을 구현하는 것은 의미가 없습니다. –

0

맞춤 클래스에 적합한 경우 둘 중 하나 또는 둘 다를 구현하십시오.

__setitem__()을 구현하면 구현하고자 선택한 의미로 yourobject[yourindex] = yourvalue 구문을 코드에 사용할 수 있습니다.

당신이 __delitem__()을 구현하는 경우 del yourobject[yourindex]

그냥 예외를 발생하는 명시 적 방법을 구현하기 위해 이해되지 않는다

는, 파이썬은 기본적으로 그것을 할 것입니다 사용할 수 있습니다 :

class Test(object): 
    pass 
test = Test() 
test['foo'] = 'bar' # will call Test.__setitem__() which is not explicitly defined 

하는 줄 것이다 TypeError: 'Test' object does not support item assignment

1

비록 맛의 문제이지만, 나는 그것들을 전혀 구현하지 않아야한다고 생각합니다. __setitem__, __delitem__이있는 클래스는 프로토콜 (암시 적으로 또는 collection abstract base classes을 사용하여 명시 적으로 변경 가능 컬렉션)을 구현합니다. 귀하의 클래스는이 인터페이스를 지원하지 않습니다. 사용자는 그 이유를 알 수 없습니다.

관련 문제