一尘不染

重写__dir__方法的正确方法是什么?

python

这个问题应该__dir__比关于更多numpy

我有一个子类numpy.recarray(在python 2.7中,numpy
1.6.2),并且我发现在对象recarray时未列出的字段名称dir(因此,ipython的自动完成功能无效)。

为了修复它,我尝试__dir__在子类中重写,如下所示:

def __dir__(self):
    return sorted(set(
               super(MyRecArray, self).__dir__() + \
               self.__dict__.keys() + self.dtype.fields.keys()))

结果是:AttributeError: 'super' object has no attribute '__dir__'。(我发现这里实际上应该在python 3.3中工作…)

作为一种解决方法,我尝试了:

def __dir__(self):
    return sorted(set(
                dir(type(self)) + \
                self.__dict__.keys() + self.dtype.fields.keys()))

据我所知,这是可行的,但当然并不优雅。

问题:

  1. 后一种解决方案对我而言是否正确,即对于的子类recarray
  2. 有没有办法使它在一般情况下起作用?在我看来,它不能用于多重继承(打断super-call链),当然,对于没有__dict__
  3. 您知道为什么recarray不支持列出其字段名称开头吗?仅仅是监督?

阅读 176

收藏
2021-01-20

共1个答案

一尘不染

你有没有尝试过:

def __dir__(self):
    return sorted(set(
               dir(super(MyRecArray, self)) + \
               self.__dict__.keys() + self.dtype.fields.keys()))
2021-01-20