2010-07-15 1 views
4

좋아 ... 그것은 어리석은 질문일지도 모른다. .. 그러나 나는 대답을 지금 발견하지 않고있다!Python copy : 기본 복사 동작을 상속하는 방법은 무엇입니까?

개체의 복사본을 실현해야합니다. 모든 특성을 복사하려면 하나 또는 둘을 제외하고는 복사본을 완전히 제어해야합니다. 기본적으로 모든 속성이 복사되는 것을 의미

>>> class test(object): 
...  def __init__(self, arg): 
...   self._a = arg 
... 
>>> t = test(123999) 
>>> t._a 
123999 
>>> tc = copy.copy(t) 
>>> tc._a 
123999 

:

여기 객체에 대한 표준 복사 동작입니다.

>>> class test(object): 
...  def __init__(self, arga, argb): 
...   self._a = arga 
...   self._b = argb 
... 
...  def __copy__(self): 
...   obj_copy = copy.copy(self) #NOT POSSIBLE OF COURSE => infinite recursion 
...   obj_copy._b = my_operation(obj_copy._b) 
...   return obj_copy 

난 당신이 포인트를 얻었기를 바랍니다 : 나는 개체의 복사 동작을 다시 사용하기를 원하지만 내 자신의 작업 후크에서 내가 뭘하고 싶은 재사용에게 다음과 같은 방법으로이 동작을합니다. 이 일을 할 수있는 깨끗한 방법이 있습니까 (for attr_name in dir(self): ... 할 필요없이) ???

+0

당신이 비교적 Python을 처음 접했을 때 객체를 복사해야한다고 생각한다면 복사가 객체 자체가 할 수없는 일을 왜하는지 정확히 설명 할 수 없다면 아마 틀릴 것입니다. – msw

+0

나는 파이썬을하는 동안 잠시 지내왔다 ... 그리고 나는이 시간을 복사해야한다는 것을 안다. – sebpiq

답변

5

당신은 다만 수 :

def __copy__(self): 
    clone = copy.deepcopy(self) 
    clone._b = some_op(clone._b) 
    return clone 

deepcopy 재귀를 피할 수 있기 때문 작동합니다. python docs에서 :

deepcopy() 함수에 의해 이러한 문제를 피할 수 : 이미 현재의 복사 단계 중에 복사 된 개체의 "메모"사전을 유지; 사용자 정의 클래스가 복사 작업 또는 복사 된 구성 요소 세트를 무시하도록 허용하는 당신이 속성을 & C가없는 경우

+0

모든 대답은 좋지만 실제로 이것은 가장 간단합니다 ... 감사합니다! – sebpiq

3

, 모든 상태를합니다 ... __dict__에 있으므로 :

...  def __copy__(self): 
...   obj_copy = object.__new__(type(self)) 
...   obj_copy.__dict__ = self.__dict__.copy() 
...   obj_copy._b = my_operation(obj_copy._b) 
...   return obj_copy 
1

나는 다음과 같은 방법으로이 작업을 수행하고 싶습니다 - 그것을 시도 :

import copy 
class test(object): 
    def __init__(self, **args): 
     self.args = args 

    def __copy__(self): 
     obj_copy = copy.deepcopy(self) 
     return obj_copy 
관련 문제