동일한 클래스의 새 인스턴스를 반환하는 객체에 대한 메소드가 있습니다. 이 메서드를 작성하는 가장 관용적 인 방법을 알아 내려고 노력 중이므로 코드를 복제하지 않고 동일한 유형의 새 개체를 생성합니다. 이 방법은 인스턴스에서 데이터를 사용하기 때문에클래스 내에서 새 객체를 생성하는 관용적 Python
, 내 첫 번째 패스는 다음과 같습니다
class Foo(object):
def get_new(self):
data = # Do interesting things
return Foo(data)
그러나, 나는 푸를 서브 클래스와 푸 반환 SubFoo에 get_new 전화, get_new 오버라이드 (override)하지 않는 경우! 그래서, 나는 classmethod 작성할 수
class Foo(object):
@classmethod
def get_new(cls, obj):
data = # Munge about in objects internals
return cls(data)
그러나, 나는이 접근하고있어 데이터가 객체에 특정한를, 그래서 "보통"(장식되지 않은) 방법으로하지 이것에 대한 캡슐을 깰 것으로 보인다. 또한 SubFoo.get_new(sub_foo_inst)
과 같이 호출해야합니다. 개체가 반환 할 형식을 "알기"만하면됩니다. - 자체와 같은 형식입니다.
클래스에 팩토리 메소드를 추가하고 로직을 복제하지 않고 모든 곳에서 리턴 유형을 대체 할 수 있다고 가정합니다.하지만 이는 서브 클래스에서 많은 작업을 수행하는 것처럼 보입니다.
그럼 내 질문은 모든 곳에서 유형에 주석을 달지 않고도 클래스 유형에 유연성을 제공하는 메소드를 작성하는 가장 좋은 방법은 무엇입니까?
classmethod는 파이썬에서 매우 관용적이지 않습니다. 팩토리는 클래스와 동일한 모듈에있는 일반 함수 일 수 있습니다. –
@Adam : 클래스 메소드에는 용도가 있습니다 (예 : 클래스 변수를 사용하고 상속을 중단하지 않으려는 경우). 정적 방법은 훨씬 더 나쁩니다. – delnan