更改dir函数

时间:2015-04-29 02:35:00

标签: python python-2.7 oop

假设您有以下类的实例:

class Foo(object):
    def __init__(self, data):
        self._data = data

foo = Foo({'bar': 'baz'})

当你dir(foo)时,你得到:

>>> dir(foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_data']

请注意属性列表末尾的_data

我想有办法为我的班级实例定制dir输出。在这种特定情况下,我想在_data字典中添加键值对,作为上一个输出中的附加项列出,如:

>>> dir(foo)
['__class__', '__delattr__', ..., '_data', 'bar']

注意属性列表末尾的_databar

我认为会有一个特殊的函数来自定义,就像您可以使用__str____repr__等自定义一个实例一样,但是避免&#39为此找到了一些东西。

更新:我正在寻找只会改变要显示的属性的内容,而不会使用以下内容更改实例__dict__

class Foo(object):
    def __init__(self, data):
        self._data = data
        self.__dict__.update(data)  # I would prefer not to do this

有没有办法做到这一点?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

是的,这是__dir__特殊方法的目的。请参阅python documentation on dir()

例如:

class Foo(object):

    def __init__(self, data):
        self._data = data

    def __dir__(self):
        return dir(object) + self.__dict__.keys() + [k for k in self._data]

foo = Foo({'bar': 'baz'})

这给出了这个:

>>> foo = Foo()
>>> dir(foo)
['__class__',
 '__delattr__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '_data',
 'bar']

请注意,如果您定义__getattr____getattribute__以便用户可以编写类似foo.bar的内容,则可能只有这样做才有意义,否则{{1会有点误导。