gpt4 book ai didi

python - 用户定义的类是可变的

转载 作者:IT老高 更新时间:2023-10-28 20:40:07 28 4
gpt4 key购买 nike

假设我想为 cartractorboat 创建一个类。所有这些类都有一个 engine 实例,我想在一个列表中跟踪所有引擎。如果我正确理解电机对象是否可变,我可以将其存储为 car 的属性以及列表中的相同实例。

我无法找到任何关于用户定义的类是否可变的可靠信息,如果在定义它们时可以选择,任何人都可以解释一下吗?

最佳答案

用户类被认为是可变的。 Python 没有(绝对)私有(private)属性,因此您始终可以通过进入内部来更改类。

要将您的类用作dict 中的键或将它们存储在set 中,您可以定义.__hash__() method.__eq__() method , promise 你的类是不可变的。在这种情况下,您通常会将您的类 API 设计为在创建后不改变内部状态。

例如,如果您的引擎由其 id 唯一定义,您可以将其用作哈希的基础:

class Engine(object):
def __init__(self, id):
self.id = id

def __hash__(self):
return hash(self.id)

def __eq__(self, other):
if isinstance(other, self.__class__):
return self.id == other.id
return NotImplemented

现在您可以在集合中使用类 Engine 的实例:

>>> eng1 = Engine(1)
>>> eng2 = Engine(2)
>>> eng1 == eng2
False
>>> eng1 == eng1
True
>>> eng1 == Engine(1)
True
>>> engines = set([eng1, eng2])
>>> engines
set([<__main__.Engine object at 0x105ebef10>, <__main__.Engine object at 0x105ebef90>])
>>> engines.add(Engine(1))
>>> engines
set([<__main__.Engine object at 0x105ebef10>, <__main__.Engine object at 0x105ebef90>])

在上面的示例中,我向集合中添加了另一个 Engine(1) 实例,但它被识别为已经存在并且集合没有改变。

请注意,就列表而言,.__eq__() 实现是重要的实现;列表不关心对象是否可变,但是使用 .__eq__() 方法,您可以测试给定引擎是否已经在列表中:

>>> Engine(1) in [eng1, eng2]
True

关于python - 用户定义的类是可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076445/

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