What is the correct way to override the __dir__ method?

前端 未结 3 576
南笙
南笙 2020-12-20 10:57

This question is meant to be more about __dir__ than about numpy.

I have a subclass of numpy.recarray (in python 2.7,

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-20 11:38

    Python 2.7+, 3.3+ class mixin that simplifies implementation of __dir__ method in subclasses. Hope it will help. 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)
    

提交回复
热议问题