2013-08-13 3 views
1

이 코드는 예상대로 작동하지만 메모리 누수가 발생할 수 있습니까?동적 클래스 특성 생성

class Method(object): 
    method = [] 
    def call(self,method,*args,**kwargs): 
     kwargs.update({'access_token': self.access_token}) 
     print method,args,kwargs 
    def __getattr__(self,name): 
     cp = Method() 
     cp.access_token = self.access_token 
     cp.method = self.method + [name] 
     return cp 
    def __call__(self,*args,**kwargs): 
     return self.call('.'.join(self.method),*args,**kwargs) 

class Api(Method): 
    access_token = 'setups on init' 

a=Api() 
a.get() 
a.set(data=1) 

또는 메소드 인스턴스가 호출 된 후 가비지가 될까요?

답변

2

메모리 누출이 없습니다.

단순히 호출 가능한 객체를 반환하는 것입니다. 더 이상 참조하지 않으면 자동으로 정리됩니다.

__getattr__ 방법은 지역 변수 이름이 아닌 다른 객체에 더 이상 참조를 추가하지 않습니다. 이 참조는 함수가 종료 될 때 지워집니다.

a.get()a.set() 식은 __call__ 메서드를 조회하고 호출하기에 충분할만큼 개체에 대한 참조 만 보유합니다. __call__ 메서드가 반환되면 Method() 인스턴스에 대한 참조 수가 0으로 떨어지고 개체가 지워집니다.

+0

'a.friends.get_related()'(최대 5 일 수 있음)를 호출해도? 모든 instares (a 제외) 청소해야합니까? – eri

+0

@eri : 예, 인터프리터의 모든 참조가 일시적이며 적절히 삭제 되었기 때문에 가능합니다. 일반 파이썬 메소드는 래퍼 객체이기도합니다 ([descriptor howto] (http://docs.python.org/2/howto/descriptor.html) 참조). 호출 표현식에 메모리 누수가 있으면 파이썬이 죽었을 것입니다 몇 백만년 전 메모리 누출 문제가 발생했습니다. :-) –