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

发布于 2021-01-29 14:59:01

这个问题应该__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不支持列出其字段名称开头吗?仅仅是监督?
关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    你有没有尝试过:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看