私は気象データの複数のソースをチェックし、Android 用スクリプト レイヤーでいくつかのスクリプトを解析するスクリプトを作成しています。Google 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
コンテキストのシェル出力は次のとおりです。
>>> 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)
か?