【问题标题】:Alter list of attributes listed by dir function更改 dir 函数列出的属性列表
【发布时间】:2015-04-29 02:34:59
【问题描述】:

假设您有以下类的实例:

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']

注意_data AND bar 在属性列表的末尾

我认为会有一个 special 函数以类似的方式自定义它,就像您可以使用 __str____repr__ 等自定义实例一样,但没有找到任何相关信息还没有。

更新:我正在寻找只改变要显示的属性,而不改变实例__dict__ 的东西:

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

有没有办法做到这一点?提前感谢您的帮助!

【问题讨论】:

  • 提供 __ dir __ 方法还不够吗?
  • 是的,但我直到现在才知道。谢谢!

标签: python python-2.7 oop


【解决方案1】:

是的,这就是__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 的内容,这样做可能才真正有意义,否则dir() 会有点误导。

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多