2017-01-18 1 views
0

슈퍼 클래스 (a.k.a. "부모"클래스)의 새 인스턴스를 만드는 메서드를 사용하여 클래스를 만들고 싶습니다.해당 클래스의 인스턴스에서 클래스의 인스턴스를 만드는 방법은 무엇입니까?

또한 위에서 설명한 클래스를 하위 클래스로 만들고이 하위 클래스에서 메서드를 상속 받아 해당 메서드를 사용하여 자체 하위 클래스의 인스턴스를 더 만들 수있게하려고합니다.

그러나, 나는이처럼 수행하려고 ...

class Superclass: 
    def makeNew(self): 
     return self.__class__() #this isn't making a clean copy 

class Subclass(Superclass): 
    def __init__(self, value = [1]): 
     self.value = value 

    def setValue(self, newValue): 
     self.value[0] = newValue 

if __name__ == "__main__": 
    s = Subclass() 
    s.setValue(5) 
    other = s.makeNew() 
    print(s.value) 
    print(other.value) 

나는

>>> [5] #s.value 
>>> [5] #other.value 

self.__class__() 나에게 슈퍼 클래스의 깨끗한 사본을 포기하지 않는거야?

내가 뭘 잘못하고 있니? 원하는 수업을 어떻게 만들 수 있습니까?

+0

"깨끗한 복사본"은 무엇이라고 생각하십니까? 대신 무엇을 얻고 있습니까? 그럼에도 불구하고 새로운 인스턴스를 생성하고 반환하는 하위 클래스에서 @ staticmethod를 정의하는 것이 다른 방법 일 것입니다. 's'가 서브 클래스의 인스턴스라면 (staticmethod에 부여한 이름)'s.make_new_instance()'로 호출 할 수 있습니다. – martineau

+0

"깨끗한 사본"이란 원래의's'와는 완전히 별개의 의미입니다. '[5] \ n [1]' –

답변

4

귀하의 makeNew 방법에는 문제가 없습니다. 그건 __init__의 문제입니다. 변경할 수있는 기본 인수가 있으면 해당 값을 수정하면 이후의 모든 기본값이 수정됩니다. 당신이 대신해야 할 것은 이것이다 :

def __init__(self, value=None): 
    if value is None: 
     value = [1] 
    # ... 

그런 식으로, 모든 새로운 인스턴스 대신 동일한 목록에 단지의 참조의 새 목록을 만드는 것입니다.

부수적으로, value이 목록이어야하는 것처럼 보이지 않습니다. 물론 여기에 표시되지 않는 다른 코드도 필요할 수 있지만이 코드가 모두 필요한 경우 self.value = ... 만 있으면됩니다. 수정하지 않고 self.value을 재 할당하기 때문에 기본 인수 만 사용해도됩니다.

+0

멋지다! 목록 및 사전은 항상 기본 인수에 대한 나쁜 아이디어입니다. none 해결책은 나의 fav이지만, 그것이 정말로 기본 주장을 가질 필요가 없다면 간단하게 그것을 전부 버릴 수있다. – Alan

+0

'makeNew' 기본 클래스 메소드에서 _is_ 문제가 발생했습니다. 'self .__ class __() '를 호출 할 때 서브 클래스 인스턴스로 설정된'self' 인자로 호출되면 서브 클래스를 참조합니다 (질문에 표시된's.makeNew()'와 같은 경우). – martineau

+0

@martineau : 왜 이것이 문제인지 모르겠습니다. 하위 클래스에서'makeNew'를 호출하면 수퍼 클래스의 인스턴스가 주어지기 때문에 문제가 아닌 예상 된 동작을 호출하는 것이 이상 할 것입니다. – zondo

관련 문제