动态类属性生成

时间:2013-08-13 11:23:39

标签: python

此代码按预期工作,但它是否会导致内存泄漏?

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实例会变成垃圾吗?

1 个答案:

答案 0 :(得分:2)

您没有内存泄漏。

您只是返回一个可调用对象;当你不再引用它时,它会被自动清理。

除了本地变量名之外,__getattr__方法不会再添加对象的引用。当函数退出时,该引用被清除。

a.get()a.set()表达式仅持有对象的引用足够长的时间来查找__call__方法并调用它。当__call__方法返回时,Method()实例的引用数下降到0并且对象被清除。

相关问题