은 이론적 인 부분과 더불어, 두 가지 질문, 그리고 실제 하나Subclassing dict : __ init __()을 호출해야합니까?
하는 서브 클래스 DICT :
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
해야 dict.__init__(self)
호출, 단지 "안전"조치로 (예를 들어, 경우 중요하지 않은 구현 세부 사항이 있습니다)? dict.__init__()
이 이 아니고이라면 코드가 파이썬의 차기 버전에서 깨질 위험이 있습니까? 나는 한 가지 또는 다른 것을하는 근본적인 이유를 찾고있다. (실제로는 dict.__init__()
가 안전하다).
내 생각에 ImageDB.__init__(self, directory)
이 호출 될 때 self는 이미 새 빈 dict 객체이며 따라서 dict.__init__
(처음에는 dict이 비어 있어야 함)을 호출 할 필요가 없습니다. 이 올바른지?
편집 :
위의 근본적인 질문 뒤에 더 실제적인 질문은 다음과 같다. 나는 db [...] 구문을 꽤 자주 사용하기 때문에 (db.contents [...] 항상하는 대신에) dict를 서브 클래 싱하는 것을 생각하고 있었다. 객체의 유일한 데이터 (속성)는 정말로 실제로 dict입니다. 데이터베이스에 몇 가지 메소드 (예 : get_image_by_name()
또는 get_image_by_code()
)를 추가하고 이미지 데이터베이스가 포함 된 디렉토리로 정의되기 때문에 __init__()
만 덮어 쓰려고합니다. 요약에서
의 (실제) 문제가 될 수있다 : 초기화가 다른 것을 제외하고, 사전처럼 작동 뭔가 좋은 구현이 무엇인지 (그것은 단지 디렉토리 이름을 사용), 그리고 추가를 가지고 행동 양식?
많은 답변에서 "공장"이 언급되었습니다. 그래서 그 모든 종기가 내려 다닌다 : 하위 클래스 dict, override __init__()
및 메서드를 추가 할 또는 메서드를 추가하는 dict 반환하는 (팩토리) 함수를 작성합니까? 첫 번째 솔루션을 선호하는 경향이 있습니다. 왜냐하면 팩토리 함수가 유형에 추가 의미 및 메소드가 있음을 나타내지 않는 객체를 반환하기 때문입니다.하지만 어떻게 생각하십니까?
편집 2 : 나는 새 클래스는 "사전에없는"경우, 특히 그 __init__
방법은 동일을 할 수없는 경우 DICT를 서브하는 것은 좋은 생각이 아니라고 모두의 대답에서 수집
인수는 dict의 __init__
(위의 "실제 질문"의 경우)입니다. 즉, 내가 올바르게 이해한다면 합의는 다음과 같을 것입니다. 하위 클래스를 만들 때 모든 메소드 (초기화 포함)는 기본 클래스 메소드와 동일한 서명을 가져야합니다. 이를 통해 isinstance (subclass_instance, dict)는 예를 들어 dict.__init__()
처럼 subclass_instance.__init__()
을 사용할 수 있음을 보장합니다.
또 다른 실질적인 질문이 나옵니다. 초기화 방법을 제외하고는 어떻게 dict와 비슷한 클래스를 구현해야합니까? 서브 클래 싱하지 않고? 이렇게하면 약간의 번거로운 상용구 코드가 필요합니다.
공장 기능이 있습니다. * instance * 비헤이비어를 사용자 정의해야하는 경우 서브 클래스를 작성할 수 있습니다. * initialization *을 오버라이드하고 싶다면 인스턴스를 표준 클래스와 다르지 않으므로 아무 것도 서브 클래 싱 할 필요가 없습니다. __init__은 인스턴스의 인터페이스 부분이 아니라 클래스의 인터페이스 부분으로 간주됩니다. –
이 문제에 관해서는 dict를 하위 클래스로 분류하는 대신 ImageDB에'__getitem__' 메서드를 추가하는 것이 가장 좋습니다. 왜냐하면 그것은 딕트가 아니기 때문입니다. 이렇게하면 클래스에 부적합한'pop()'과 같은 모든 메소드를 사용하지 않고도 원하는 것을 할 수 있습니다. –
@gs : 팝에 대한 좋은 지적; 적어도 현재로서는 관계가 없습니다 (데이터베이스 내용은 초기화시에만 정의됩니다). 구현이 필요한 기능을 완벽하게 충족시키는 것이 실제로 가장 좋은 방법이라고 생각합니다. – EOL