pythonで__ DIR__メソッドをオーバーライドするための正しい方法。この質問を、約<code>numpy</code>より<code>__dir__</code>詳細であることを意味する
は、私が(のpython 2.7、numpyの1.6.2で)numpy.recarray
のサブクラスを持っている、と私はdir
は(したがって、ipythonのオートコンプリートが動作しません)オブジェクトをINGの際recarray
のフィールド名が表示されていません気づきました。
def __dir__(self):
return sorted(set(
super(MyRecArray, self).__dir__() + \
self.__dict__.keys() + self.dtype.fields.keys()))
をもたらした:AttributeError: 'super' object has no attribute '__dir__'
それを修正しようと
は、私はこのように、私のサブクラスで__dir__
をオーバーライドしてみました。 は、回避策として
を(私はこれは実際には...のpython 3.3で動作するはずhereを見つけました)、私が試した:
def __dir__(self):
return sorted(set(
dir(type(self)) + \
self.__dict__.keys() + self.dtype.fields.keys()))
を私の知る限り、これは動作しますが、もちろん、ありませんエレガントに。
質問:
- 後者の解決策は、すなわち
recarray
のサブクラスのために、私の場合は正しいですか? - 一般的なケースで動作させる方法はありますか?それは複数の継承(
super
-callチェーンを破って)で動作しないと思われます。もちろん、__dict__
のオブジェクトではありません。 - は、開始するフィールド名のリストをサポートしていませんと?単なる見落としですか?
を私は 'recarray'と' dir'をサブクラス化してみました** ** 'recarray'の属性を示しています。あなたは何が欠けていると思いますか? – Bakuriu
'self.dtype.fields.keys()' – shx2