2016-03-24 14 views
1

Warum werden einige Objektmethoden/Attribute nicht angezeigt, wenn ich dir für das Objekt aufruft?Warum zeigt Dir nicht alle Python-Objektattribute an?

Beispiel:

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

kehrt False. Aber das Aufrufen von e.H funktioniert gut (Rückgabe eines anderen dünn besetzten Matrixobjekts). Warum ist das so, und wie kann ich diese versteckten Attribute sehen?

Ich benutze Python 3.5.1.

+0

Sie haben möglicherweise die Methode '__dir__' überschrieben. Ich benutze manchmal 'help (e)' und 'e .__ dict__'. Ich bin mir über meine Antwort nicht sicher, also überlasse ich es als Kommentar und lasse andere weiter ausführen. – Bahrom

Antwort

2

e.H, e.A, e.T sind Pseudoeigenschaften des dünn besetzten Matrixobjekts.

shape ist eine Eigenschaft. In sparse.base.py finde ich

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

während die dict nur enthält:

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

get_shape wahrscheinlich greift _shape. set_shape begrenzt wahrscheinlich unsere Fähigkeit zu ändern _shape.

Ich kenne keine saubere Methode, alle definierten Eigenschaften für ein Objekt wie dieses zu finden. Im Idealfall sollten sie in der Dokumentation aufgeführt sein, aber sparse Dokumentation ist nicht ideal.

Es gibt eine e.getH Methode, die die gleiche Sache wie e.H zurückkehrt, so dass ich vermute, es ist ein Stück Code, wahrscheinlich in einigen Super

H = property(fget=getH) 

Nope - in sparse.base.py finde ich eine Neudefinition von __getattr__, so es ist ein ganz anderer Mechanismus (nicht Eigentum und nicht __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") 

In ipython ich dies mitholen kannoder sparse.base??.

getattr kann verwendet werden, alle holen diese Attribute und Eigenschaften (und Verfahren)

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

Mit dem inspect Modul I eine Liste von members erhalten kann, z.B.

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

aber das noch nicht, diese speziell diejenigen in der __getattr__ Methode definiert auflistet.

Verwandte Themen