2011-10-20 6 views
4

새로운 버전의 자체를 반환하는 수퍼 클래스에 함수가 있습니다. 특정 함수를 상속하는이 수퍼 클래스의 하위 클래스가 있지만 하위 클래스의 새 버전을 반환합니다. 함수 호출이 부모로부터 왔을 때 부모의 버전을 반환하도록 코드를 작성하려면 어떻게해야합니까? 그러나 자식으로부터 호출 될 때 새로운 버전의 자식을 반환합니까? new 만약Python 상속 : 서브 클래스를 반환하십시오.

+0

을 유형을 구분해야합니다. 상속의 한 가지 특징은 서브 클래스의 인스턴스가 수퍼 클래스의 인스턴스로 작동 할 수 있다는 것입니다. –

+0

함수는 부모 함수에 있습니다. 새 객체를 반환합니다. 부모 인스턴스를 반환하면 자식 함수에 액세스 할 수 없습니다. 하지만 다른 어떤 아이도이 기능을 사용할 수 없기 때문에 (그리고 부모는 실제로는 그럴 수 없기 때문에) 아이를 돌려 줄 수는 없습니다. 그래서 나는 그것을 불렀던 어떤 것의 실체를 돌려주고 싶다. – user592419

답변

6

사용, self에 classmethod 의존하지 않습니다

class Parent(object): 
    @classmethod 
    def new(cls,*args,**kwargs): 
     return cls(*args,**kwargs) 
class Child(Parent): pass 

p=Parent() 
p2=p.new() 
assert isinstance(p2,Parent) 
c=Child() 
c2=c.new() 
assert isinstance(c2,Child) 

을 또는 new 경우, self에 따라 self의 클래스를 결정하는 type(self)를 사용합니까 : 왜 당신을

class Parent(object): 
    def new(self,*args,**kwargs): 
     # use `self` in some way to perhaps change `args` and/or `kwargs` 
     return type(self)(*args,**kwargs) 
+0

두 번째 경우에도 첫 번째 방법을 사용해야하는 상황은 무엇입니까? 독자들에게'new'가'self' 나'args' /'kwargs'를 돌연변이시키지 않는다는 것을 분명히하기 위해서입니까? – nivk

+0

@nivk : classmethod의 주요 용도 중 하나는 [대체 생성자]를 정의하는 것입니다 (https://stackoverflow.com/a/1950927/190597). 이것이 이해 된 협약이기 때문에, 당신을 위해 당신의 코드를 읽는 다른 사람들에게도이 대회를 따르는 것이 도움이됩니다. – unutbu

+0

이 경우 유연함으로 인해 두 번째 방법을 선호해야합니다. OP에서 링크에 표시된 의미에서 대체 생성자가 필요하다고 생각하지 않습니다. (여기에서 나를 데려온 사용 사례도 마찬가지입니다.) 첫 번째 방법을 선호해야 할 부분이 있습니까? – nivk

관련 문제