擅长:python、mysql、java
<ol>
<li><p>3:是的,你的解决方案是正确的。<code>recarray</code>没有定义<code>__dir__</code>仅仅是因为默认实现是好的,所以他们没有麻烦实现它,而且<code>numpy</code>的开发人员没有设计要子类化的类,所以我不明白他们为什么要麻烦。</p>
<p>对不是专门为继承而设计的内置类型或类进行子类划分通常是一个坏主意,因此我建议您使用委托/组合而不是继承,除非有特定的原因(例如,您希望将其传递给一个<code>numpy</code>函数,该函数使用<code>isinstance</code>进行异常检查)。</p></li>
<li><p>不,正如您在python3中指出的那样,他们更改了实现,因此有一个<code>object.__dir__</code>,但是在其他python版本上,我看不到您能做的任何事情。同样,将<code>recarray</code>与多重继承一起使用简直是疯了,事情会<em>破裂。多重继承应该仔细设计,通常类是专门设计用于它的(例如mix-ins)。所以我不会费心处理这个案子,因为不管是谁尝试,都会被其他问题所困扰。</p>
<p>我不明白为什么你应该关心那些没有<code>__dict__</code>的类。。。既然你的子类有了它,它该怎么破?当您要更改子类实现时,例如使用<code>__slots__</code>,您也可以轻松地更改<code>__dir__</code>。如果您想避免重新定义<code>__dir__</code>,可以简单地定义一个函数来检查<code>__dict__</code>,然后检查<code>__slots__</code>等。但是,请注意,属性可以通过<code>__getattr__</code>和<code>__getattribute__</code>以微妙的方式生成,因此您不能</strong>可靠地捕获所有属性。</p></li>
</ol>