此代码按预期工作,但它是否会导致内存泄漏?
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)
或者在调用后,Method实例会变成垃圾吗?
答案 0 :(得分:2)
您没有内存泄漏。
您只是返回一个可调用对象;当你不再引用它时,它会被自动清理。
除了本地变量名之外,__getattr__
方法不会再添加对象的引用。当函数退出时,该引用被清除。
a.get()
和a.set()
表达式仅持有对象的引用足够长的时间来查找__call__
方法并调用它。当__call__
方法返回时,Method()
实例的引用数下降到0并且对象被清除。