2015-04-29 78 views
1

让我们假设你有下面的类的实例:在结束阿尔特列表

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

_data

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

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

当你dir(foo)你物业列表

我想有一个方法来定制什么dir输出对于我的班级的例子。在这种特殊情况下,我想添加的键值对在_data字典中被列为在前面的输出额外的项目,如:在财产结束

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

_databar名单

我以为会有一个特殊功能类似的方式来定制这个就像你可以自定义一个实例与__str____repr__等,但还没有找到这样的东西呢。

UPDATE:我正在寻找的东西,只有改变属性来显示,而不会像改变实例__dict__

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

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

+1

提供的__ dir __方法不够吗? – AMacK

+0

它是,但直到现在我还不知道它。谢谢! – Gerard

回答

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,否则dir()会有点误导。