gpt4 book ai didi

python - 覆盖 __dir__ 方法的正确方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 20:29:17 25 4
gpt4 key购买 nike

这个问题更多的是关于 __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__'。(我发现 here 这实际上应该在 python 3.3 中工作......)

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

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

据我所知,这个很有效,但当然没有那么优雅。

问题:

  1. 后一种解决方案在我的情况下是否正确,即对于 recarray 的子类?
  2. 有没有办法让它在一般情况下工作?在我看来,它不适用于多重继承(打破 super-调用链),当然,对于没有 __dict__...的对象...
  3. 你知道为什么 recarray 不支持列出它的字段名开头吗?仅仅是疏忽?

最佳答案

Python 2.7+、3.3+ 类混合,简化了子类中 __dir__ 方法的实现。希望它会有所帮助。 Gist .

import six
class DirMixIn:
""" Mix-in to make implementing __dir__ method in subclasses simpler
"""

def __dir__(self):
if six.PY3:
return super(DirMixIn, self).__dir__()
else:
# code is based on
# http://www.quora.com/How-dir-is-implemented-Is-there-any-PEP-related-to-that
def get_attrs(obj):
import types
if not hasattr(obj, '__dict__'):
return [] # slots only
if not isinstance(obj.__dict__, (dict, types.DictProxyType)):
raise TypeError("%s.__dict__ is not a dictionary"
"" % obj.__name__)
return obj.__dict__.keys()

def dir2(obj):
attrs = set()
if not hasattr(obj, '__bases__'):
# obj is an instance
if not hasattr(obj, '__class__'):
# slots
return sorted(get_attrs(obj))
klass = obj.__class__
attrs.update(get_attrs(klass))
else:
# obj is a class
klass = obj

for cls in klass.__bases__:
attrs.update(get_attrs(cls))
attrs.update(dir2(cls))
attrs.update(get_attrs(obj))
return list(attrs)

return dir2(self)

关于python - 覆盖 __dir__ 方法的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15507848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com