Python中文
首页
教程
问答
标签
搜索
登录
注册
什么是使一个不可变类的Pythonic方法?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我目前正在用Python处理一些数据结构,我希望它们是可散列的(这样它们就可以存储在字典和集合中)。到目前为止,我已经看到了三种主要的方法:</p> <p>①构造一个普通类并给它一个<code>__hash__</code>方法。你知道吗</p> <pre><code>class DataStructure: def __init__(self, member): self.member = member def __hash__(self): return hash(self.member) def __eq__(self, other): return isinstance(other, DataStructure) and self.member == other.member </code></pre> <p>但这只是“相信”最终用户永远不会变异<code>member</code>。如果他们在把它存储在集合或字典中的时候对它进行了变异,就会产生不好的结果。你知道吗</p> <p>②使用<code>collections.namedtuple</code>。你知道吗</p> <pre><code>DataStructure = collections.namedtuple('DataStructure', ('member',)) </code></pre> <p>但是<code>namedtuple</code>不能有成员函数,如果有成员函数就更好了。你知道吗</p> <p>③使用<code>__slots__</code>并重写<code>__setattr__</code>,如<a href="https://www.blog.pythonlibrary.org/2014/01/17/how-to-create-immutable-classes-in-python/" rel="nofollow noreferrer">here</a>所示。你知道吗</p> <pre><code>class DataStructure: __slots__ = ['member'] def __init__(self, member): super(DataStructure, self).__setattr__('member', member) def __setattr__(self, key, value): raise ValueError('Mutating this object is Not Allowed') # also define __hash__ and __eq__ here </code></pre> <p>但是这个<a href="http://code.activestate.com/lists/python-list/531365/" rel="nofollow noreferrer">doesn't seem to be intended usage</a>,也使得继承更加复杂。最重要的是,它不觉得“Python”。你知道吗</p> <p>那么:<strong>在Python中创建不可变类的首选方法是什么?</strong>希望自定义数据结构是可散列的似乎并不奇怪,毕竟这就是<code>__hash__</code>存在的原因。我更愿意让类变为不可变的,而不是告诉用户“您可以自由地分配给这些成员,但是如果这样做,您的集合和字典可能会崩溃和烧毁”——Python通常会首先尝试不让人们犯这些错误(这就是<code>set</code>和<code>frozenset</code>是不同的原因)。你知道吗</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>在要“只读”的变量前面加一个“\”。它仍然可以从类内更改,但是IDE不会预测它,如果您尝试从类外更改它们,它会抛出警告。你知道吗</p> <pre class="lang-py prettyprint-override"><code>__slots__ = ('_member',) </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
为什么我的神经网络模型的准确性不能在这个训练集上得到提高?
10 回答
为什么我的神经网络模型的权重变化不大?
6 回答
为什么我的神经网络的成本不断增加?
2 回答
为什么我的神经网络的输入pickle文件是19GB?
3 回答
为什么我的神经网络给属性错误?“非类型”对象没有属性“形状”
3 回答
为什么我的神经网络训练这么慢?
6 回答
为什么我的神经网络输出错误?
5 回答
为什么我的神经网络预测适用于MNIST手绘图像时是正确的,而适用于我自己的手绘图像时是不正确的?
2 回答
为什么我的神经网络验证精度比我的训练精度高,而且它们都是常数?
8 回答
为什么我的私人用户间聊天会显示在其他用户的聊天档案中?
6 回答
为什么我的积分的绝对误差估计值大于积分(使用scipy.integrate.nqad)?
5 回答
为什么我的积层回归器得分比它的组件差?
7 回答
为什么我的移动方法不起作用?
5 回答
为什么我的稀疏张量不能转换成张量
3 回答
为什么我的稀疏张量不能转换成张量?
5 回答
为什么我的程序“停止”了?
9 回答
为什么我的程序一直试图占用所有可用的CPU
6 回答
为什么我的程序不使用指定的代理
10 回答
为什么我的程序不工作(python帮助中的反向函数)?
4 回答
为什么我的程序不工作时,我使用多处理模块
9 回答