假设您有以下类的实例:
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
和bar
我认为会有一个特殊的函数来自定义,就像您可以使用__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
有没有办法做到这一点?在此先感谢您的帮助!
答案 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会有点误导。