[英]Why dir doesn't show all Python object attributes?
为什么当我在对象上调用dir
时,某些对象方法/属性不显示?
例子:
from scipy import sparse
e = sparse.eye(2)
'H' in dir(e)
返回False
。 但是调用eH
工作得很好(返回另一个稀疏矩阵对象)。 为什么会这样,我如何才能看到这些隐藏的属性?
我正在使用 Python 3.5.1。
eH
, eA
, eT
是稀疏矩阵对象的伪特性。
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
方法,它返回与eH
相同的东西,所以我怀疑有一段代码,可能在某个超类中
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__
方法中定义的这些特殊的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.