擅长:python、mysql、java
<p>“更改对象属性的值”可能会导致问题。这是众所周知的。你现在也知道了。这并不代表语言。它简单地说,你学到了动态语言编程的重要一课。在</p>
<ol>
<li><p>单元测试绝对会发现这一点。你不必嘲笑所有的库类。有些人说,只有在完全隔离的情况下进行测试,它才是一个单元测试。这太傻了。您必须信任库模块——这是您的体系结构的一个特性。与其嘲笑他们,不如利用他们。(为自己新开发的库编写模拟非常重要。模拟进行昂贵API调用的库也很重要。)</p>
<p>在大多数情况下,您可以(并且应该)用<em>real</em>库模块测试您的类。这将找到拼写错误的属性名。</p></li>
<li><p>另外,既然您知道属性是动态的,那么很容易验证属性是否存在。怎样?在</p>
<p>在编写过多代码之前,请使用交互式Python来研究类。在</p>
<p>请记住,Python不是Java,也不是C语言。您可以交互式地执行Python并立即确定拼写是否有错误。编写大量代码而不进行任何交互确认——这是使用Python的错误方法。在</p>
<p>一些交互式的探索会发现拼写错误的属性名。</p></li>
<li><p>最后,对于您自己的类,可以将可更新属性包装为属性。这使得调试任何拼写错误的属性名变得更容易。再说一遍,你知道要检查一下。您可以使用交互式开发来确认属性名称。</p></li>
</ol>
<p>与<code>__setattr__</code>纠缠会产生问题。在某些情况下,我们实际上需要向对象添加属性。为什么?这比为一个需要维护更多状态信息的特殊情况创建一个完整的子类要简单得多。在</p>
<hr/>
<p>你还可以说:</p>
<p>我被一个C程序烧坏了,因为<code>______</code>,它绝对不能工作。[在此处插入任何已知的C语言问题。没有数组边界检查,例如]这会使C致命地有缺陷吗?在</p>
<p>我被一个更改了列名的DBA烧死了,所有的SQL都崩溃了。对所有这些进行单元测试是很痛苦的。这是否使关系数据库存在致命缺陷?在</p>
<p>我被一个更改目录权限的系统管理员烧死了,我的应用程序崩溃了。几乎不可能找到。这是否意味着操作系统存在致命缺陷?在</p>
<p>我被一个COBOL程序烧坏了,有人修改了复制本,忘记了重新编译程序,我们无法调试它,因为源代码看起来很完美。然而,实际上COBOL存在致命的缺陷,所以这不是一个好例子。在</p>