gpt4 book ai didi

python - 我想要一个类' __init__ 将对象添加到列表中,但我想防止冗余并且 "if self not in objectlist"不工作

转载 作者:太空宇宙 更新时间:2023-11-04 09:13:12 25 4
gpt4 key购买 nike

我正在编写一个脚本来检查天气数据的多个来源,然后在 Scripting Layer for 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) 的操作?

最佳答案

您的自定义类没有定义相等的含义。如果您要添加 __eq__告诉 python 如何比较两个实例的方法,in 测试将能够找到重复项:

def __eq__(self, other):
if not isinstance(other, self.__class__):
return NotImplemented
return self.url == other.url and self.unit == other.unit

为了完善该方法,您还应该添加一个__ne__ 方法:

def __ne__(self, other):
return not self.__eq__(other)

如果您的 weatherdata 对象在创建后没有改变(不可变),您可以添加一个 __hash__ method并将您的实例存储在一个集合而不是一个列表中。使用集合会加快 in 测试。 __hash__ 方法示例如下:

def __hash__(self):
return hash((self.url, self.unit))

关于python - 我想要一个类' __init__ 将对象添加到列表中,但我想防止冗余并且 "if self not in objectlist"不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com