栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用户定义的类是否可变

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用户定义的类是否可变

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

为了将您的类用作a中的键

dict
或将它们存储在中
set
,您可以定义一个
.__hash__()
方法和一个
.__eq__()
方法,从而保证您的类是不可变的。在这种情况下,通常将类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 == eng2False>>> eng1 == eng1True>>> eng1 == Engine(1)True>>> engines = set([eng1, eng2])>>> enginesset([<__main__.Engine object at 0x105ebef10>, <__main__.Engine object at 0x105ebef90>])>>> engines.add(Engine(1))>>> enginesset([<__main__.Engine object at 0x105ebef10>, <__main__.Engine object at 0x105ebef90>])

在上面的示例中,我

Engine(1)
向集合添加了另一个实例,但是该实例已被识别为已经存在,并且集合没有更改。

请注意,就列表而言,

.__eq__()
实现是重要的。列表并不关心对象是否可变,但是使用
.__eq__()
适当的方法,您可以测试给定引擎是否已在列表中:

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659617.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号