<p>别再上课了。<a href="http://pyvideo.org/video/880/stop-writing-classes" rel="nofollow">Really</a>。这是Python中常见的反模式,它在java和C++中对很多人学习的程度较低。部分原因是Java中除了包含类之外什么都没有发生。当你有一个没有状态的类,<strong>并且</strong>你没有被困在Java中,忘记这个类。在</p>
在爪哇和C++中,创建集合类更重要,因为两种语言都没有列表、集合、序列、字典等。在爪哇/C++中,任何聚合类型都必须编写类,加载库或实例化模板。这增加了编写类的频率:如果我想要一个<code>Message *</code>的向量,那么我必须像您一样创建一个:</p>
<pre><code>collection1 = MessageCollection()
m1 = Message()
m2 = Message()
collection2 = collection1 + m1 + m2
class Message:
def __add__(self, msg_or_collection):
if isinstance(msg_or_collection, Message):
return MessageCollection([self, msg_or_collection])
elif isinstance(msg_or_collection, MessageCollection)
return msg_or_collection.append(self)
raise TypeError("can't add %s to Message" % type(msg_or_collection))
</code></pre>
<p>但有一些事情可能会更好。不编写的代码中没有缺陷,更糟糕的是,每次使用<code>isinstance</code>时,您都增加了代码耦合,从而使MessageCollection和Message变得相互缠绕、不可分割。所以我们将删除<code>Message.add</code>这将删除<code>+</code>你非常喜欢的。但是,我们可以避免这种情况,因为除了用于链接消息之外,您没有为消息收集指定任何行为,我们已经可以很容易地做到这一点</p>
^{pr2}$
<p>我们丢失了一个基于多态输入类型的多态返回类型的类方法。我们现在知道了<code>messages.append(m3)</code>的时间复杂性,因为我们非常熟悉列表,并且我们希望对<code>messages</code>进行的所有切片、迭代、操作和更改都已经可用,因为{<cd6>}<strong>是一个</strong>列表;MessageCollection可能是。如果不得不使用<code>messages.append(m3)</code>真的让你很沮丧,你仍然有</p>
<pre><code>messages += m3
</code></pre>
<p>内置的。在</p>