클래스가 부모 클래스가 지원하는 일부 연산을 지원하지 않는다는 것을 나타 내기위한 방법이 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을 위반하는 것으로 알고 있지만, 유형 안전을 원한다면 처음에는 파이썬을 사용하지 않을 것입니다. ;)
왜'아이에서 NotImplementedError' 인상? 또한 동적 타이핑은 깨진 클래스 구조를 만드는 것과 동일하지 않습니다. 왜 당신이 이것을 필요로한다고 생각하는지에 대해 약간의 맥락을 제시 할 수 있습니까? – jonrsharpe