2016-03-24 2 views
1

Почему некоторые объектные методы/атрибуты не отображаются, когда я вызываю dir на объект?Почему dir не показывает все атрибуты объекта Python?

Пример:

from scipy import sparse 
e = sparse.eye(2) 
'H' in dir(e) 

возвращается False. Но вызов e.H работает просто отлично (возвращает другой разреженный объект матрицы). Почему это так, и как я могу видеть эти скрытые атрибуты?

Я использую Python 3.5.1.

+0

Возможно, они переопределили метод '__dir__'. Иногда я использую 'help (e)' и 'e .__ dict__'. Я не уверен в моем ответе, поэтому, я оставлю его в качестве комментария, и пусть другие уточнят. – Bahrom

ответ

2

e.H, e.A, e.T - псевдо-свойства разреженного матричного объекта.

shape является собственностью. В sparse.base.py я нахожу

shape = property(fget=get_shape, fset=set_shape) 

в то время как dict содержит только:

In [121]: e.__dict__ 
Out[121]: 
{'_shape': (2, 2), 
'data': array([[ 1., 1.]]), 
'format': 'dia', 
'maxprint': 50, 
'offsets': array([0])} 

get_shape вероятно обращается _shape. set_shape, вероятно, ограничивает нашу способность изменять _shape.

Я не знаю, как можно найти все определенные свойства для такого объекта. В идеале они должны быть указаны в документации, но документация sparse не идеальна.

Существует e.getH метод, который возвращает то же самое, как e.H, так что я подозреваю, что есть кусок кода, вероятно, в некоторых суперкласса

H = property(fget=getH) 

Неа - в sparse.base.py я нахожу переопределение __getattr__, так это совершенно другой механизм (не собственность и не __dict__):

def __getattr__(self, attr): 
    if attr == 'A': 
     return self.toarray() 
    elif attr == 'T': 
     return self.transpose() 
    elif attr == 'H': 
     return self.getH() 
    elif attr == 'real': 
     return self._real() 
    elif attr == 'imag': 
     return self._imag() 
    elif attr == 'size': 
     return self.getnnz() 
    else: 
     raise AttributeError(attr + " not found") 

В ipython я могу принести это с In [152]: e.__getattr__?? или sparse.base??.

getattr могут быть использованы для извлечения всех этих атрибутов и свойств (и методы)

In [161]: getattr(e,'shape') 
Out[161]: (2, 2) 

In [162]: getattr(e,'_shape') 
Out[162]: (2, 2) 

In [163]: getattr(e,'H') 
Out[163]: 
<2x2 sparse matrix of type '<type 'numpy.float64'>' 
    with 2 stored elements in Compressed Sparse Column format> 

In [164]: getattr(e,'transpose') 
Out[164]: 
<bound method dia_matrix.transpose of <2x2 sparse matrix of type '<type 'numpy.float64'>' 
    with 2 stored elements (1 diagonals) in DIAgonal format>> 

С inspect модуля я могу получить список из members, например,

[i[0] for i in inspect.getmembers(e)] 

но до сих пор не перечислить эти специальные значения, определенные в методе __getattr__.

Смежные вопросы