5

나는 모델에게 멀티 테이블 상속을 사용하여장고 상속 : 모든 하위 클래스에 대해 한 가지 방법을 사용하는 방법은 무엇입니까?

ChildModelA(BaseModel), ChildModelB(BaseModel), ... 

BaseModel 

여러 하위 클래스가 있습니다. 앞으로 나는 수십 개의 서브 클래스 모델을 가질 계획입니다.

모든 서브 클래스는

do_something() 

가 어떻게이 BASEMODEL 인스턴스에서 do_somthing 호출 할 수있는 방법의 일부 구현이? (솔루션없이)

거의 동일한 문제는 여기에 게시됩니다 :
http://peterbraden.co.uk/article/django-inheritance

더 간단한 질문 : 나는 가능한 모든 서브 클래스를 확인하지 않고 그 서브 클래스 인스턴스 중 하나에 BASEMODEL의 instnace를 해결하는 방법?

답변

1

기본 유형의 인스턴스로 작업하게 될 것입니까, 아니면 항상 자녀의 인스턴스로 작업하게됩니까? 후자의 경우에는 개체 자체 IS-A 자식 형식이므로 기본 형식에 대한 참조가있는 경우에도 메서드를 호출하십시오.

파이썬 지원 duck typing 이것은 자식 인스턴스가 실제로이 메서드를 가질 것이므로 메서드 호출이 적절하게 연결된다는 것을 의미합니다.

의 방법 또는 속성 서명 검사를 통해서가 아니라 어떤 종류의 객체에 대한 명시 적 관계에 의해 객체의 유형을 결정 파이썬 프로그래밍 스타일 ("그것은 오리처럼 외모와 처럼 꽥꽥 경우 오리입니다. " 특정 유형의 인터페이스가 아니라 인터페이스를 강조함으로써 잘 디자인 된 코드 은 다형성 대체를 허용하여 유연성을 향상시킵니다. Duck-typing 은 type() 또는 isinstance()를 사용한 테스트를 피합니다. 대신 은 hasattr() 테스트 또는 EAFP 프로그래밍을 사용합니다. EAFP이 Easier to Ask Forgiveness than Permission을 의미

참고 :

쉽게 권한보다 용서를 물어. 이 일반적인 파이썬 코딩 스타일은 가정이 잘못된 것으로 판명 될 경우 유효한 키 또는 속성의 존재를 가정하고 예외를 포착합니다. 이 깨끗하고 빠른 스타일은 많은 try 및 except 문이 있음을 특징으로합니다. 이 기술은 C.와 같은 다른 많은 언어에서 일반적인 LBYL 스타일과 대조됩니다.

+1

이것은 모두 정확하지만이 경우에는 관련이 없습니다. 문제는 Django 다중 테이블 상속을 사용하여 작업 할 때 객체가 실제로는 자식 유형 (즉, 상응하는 객체 유형을 가진 객체) 인 경우에도 기본 클래스의 인스턴스를 사용할 수 있습니다 (즉 기본 테이블을 쿼리하는 것과 같은) 자식 테이블의 항목). –

0

나는 Andrew와 동의합니다. 몇 가지 사이트에서 우리는 대부분의 메소드에 지원하는 클래스를 가지고 있습니다 (그러나 필드는 아닙니다 (이것은 ORM 사전 리팩터입니다)). 그들은 방법을 이해할 수없는 상황을 회피하기 위해 hasattr을 사용합니다.

이것은 우리의 대부분의 클래스는 다음과 같이 정의 의미 : 기본적으로 물건의 종류의 믹스 인 유형의

class Foo(models.Model, OurKitchenSinkClass): 

. 훌륭하게 작동하고 유지하기 쉽습니다.

2

가능한 모든 하위 클래스를 검사하지 않으려면 하위 클래스와 연결된 클래스 이름을 기본 클래스에 정의 된 필드에 저장하는 것이 유일한 방법입니다. 곧 비슷한 문제에 직면 할 것 같은이 대답은 나를 행복하게하지 않고 나도 더 나은 솔루션을보고 싶어요

def resolve(self): 
    module, cls_name = self.class_name.rsplit(".",1) 
    module = import_module(module) 
    cls = getattr(module, cls_name) 
    return cls.objects.get(pk=self.pk) 

: 귀하의 기본 클래스는이 같은 방법이있을 수 있습니다.

+0

이것은 본질적으로 수행해야하는 작업이지만 contrib.contenttypes를 사용하여보다 명확한 방법으로 수행 할 수 있습니다. 내 대답을 보라. –

+0

안녕 Carl, 나는 너의 대답을 볼 수 없다. 어쩌면 다시 게시하거나 도움이되는 링크를 제공 할 수 있습니까? 고마워. –

+0

신경 쓰지 마라, 알았다. 칼 감사합니다. –