我正在编写一个脚本来检查多个来源的天气数据,然后将它们解析为 Android 脚本层上的一些脚本。谷歌 API 停止工作,所以这是旧天气模块的一个被黑掉的替代品。
我创建了一个名为“weatherdata”的类,我想让该类的所有实例都将自己添加到一个名为“weatherobjects”的列表中,对于这样的恶作剧:
for source in weatherobjects:
source.check()
这里有一个问题:每次调用获取天气的函数时,它都会导致对象运行它们的__init__
方法(我认为这在技术上称为构造方法?)而不破坏对象或清除列表。这是故意的。当函数在模块的生命周期中被多次调用,并且对象被冗余地添加到列表中时,就会出现问题。这似乎是内存泄漏的潜在来源。
这是__init__
方法:
class weatherdata():
def __init__(self, url, unit = 'f'):
self.url = url
self.unit = unit
print(self) #debug statement, please ignore
if self not in weatherobjects:
weatherobjects.append(self)
if self.url.count("yahoo"):
self.yahoo = True
else:
self.yahoo = False
self.check()
还有麻烦的功能:
def fetch_weather(location=98661, hl='', weatherobjects= []):
yahoo = weatherdata(yahoo_url, 'f')
wunderground = weatherdata(wunderground_url, 'f')
data = {}
data['city'] = 'Vancouver'
data['temperature'] = wunderground.temp
data['conditions'] = 'foo'
return data
这是上下文的一些 shell 输出:
>>> weatherobjects
[<__main__.weatherdata object at 0x01F8BDF0>, <__main__.weatherdata object at 0x02035B70>]
>>> for i in range(3):
... fetch_weather()
...
{'city': 'Vancouver', 'conditions': 'foo', 'temperature': '66.7'}
{'city': 'Vancouver', 'conditions': 'foo', 'temperature': '66.7'}
{'city': 'Vancouver', 'conditions': 'foo', 'temperature': '66.7'}
>>> weatherobjects
[<__main__.weatherdata object at 0x01F8BDF0>, <__main__.weatherdata object at 0x02035B70>, <__main__.weatherdata object at 0x01FA2E10>, <__main__.weatherdata object at 0x01FA2FB0>, <__main__.weatherdata object at 0x02035C30>, <__main__.weatherdata object at 0x02035E10>, <__main__.weatherdata object at 0x02035DF0>, <__main__.weatherdata object at 0x02035D10>]
>>> len(weatherobjects)
8
如您所见,列表中有很多冗余。是否可以在方法中做到这一点__init__
?还是我需要一个主要功能来做类似的事情weatherobjects.append(foo)
?