0

클래스가 부모 클래스가 지원하는 일부 연산을 지원하지 않는다는 것을 나타 내기위한 방법이 Python 3에 있습니까? * 클래스가 에서 None으로 설정할 수 있음을 알 수 있습니다. 그러나 이것은 작동하지 않는 것으로 나타납니다. 일반적으로서브 클래스에서 어떻게 파이썬 매직 메소드를 "정의 해제"할 수 있습니까?

예를 들어 __len__ 메서드를 사용하는 컬렉션 클래스가 있다고 가정하고 크기가 정의되지 않은 무제한 컬렉션을 나타내는 하위 클래스를 만들고 싶습니다. 하위 클래스에서 __len__None으로 설정하면 컬렉션의 길이를 가져올 때 추악한/혼란스러운 오류 메시지가 표시됩니다.

>>> class C: 
...  def __len__(self): 
...   return 3 
... 
>>> class D(C): 
...  __len__ = None 
... 
>>> len(D()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not callable 

나는 전혀 __len__을 정의하지 않았다 D 것처럼 오류를 좀하고 싶습니다 :

>>> class E: 
...  pass 
... 
>>> len(E()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object of type 'E' has no len() 

This question가 관련되어

그러나 내 질문에 마법 방법/연산자 오버로딩에 특별히 관련이 있습니다. 파이썬 매직 메소드가 객체의 타입을 직접 참조하기 때문에, __getattribute__을 오버라이드하거나 디스크립터를 사용하는 것과 같은 가능한 접근법은 여기서 작동하지 않는다.

* 참고 : 이것은 Liskov substitution principle을 위반하는 것으로 알고 있지만, 유형 안전을 원한다면 처음에는 파이썬을 사용하지 않을 것입니다. ;)

+0

왜'아이에서 NotImplementedError' 인상? 또한 동적 타이핑은 깨진 클래스 구조를 만드는 것과 동일하지 않습니다. 왜 당신이 이것을 필요로한다고 생각하는지에 대해 약간의 맥락을 제시 할 수 있습니까? – jonrsharpe

답변

2

난 그게 더 혼란 스러울 수도 있기 때문에 그것을 "정의하지"않을 것입니다. 나는 명시하고이 컬렉션은이 __len__ 지원하지 않는 이유를 진술이 그것에 TypeError 메시지를 조정할 것 :

class D(C): 
    def __len__(self): 
     raise TypeError("Unbounded collection defines no __len__")