【问题标题】:Why dir doesn't show all Python object attributes?为什么 dir 不显示所有 Python 对象属性?
【发布时间】:2016-07-12 17:46:27
【问题描述】:

当我在对象上调用dir 时,为什么某些对象方法/属性不显示?

例子:

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

返回False。但是调用e.H 工作得很好(返回另一个稀疏矩阵对象)。为什么会这样,我怎样才能看到这些隐藏的属性?

我正在使用 Python 3.5.1。

【问题讨论】:

  • 他们可能已经覆盖了__dir__ 方法。我有时使用help(e)e.__dict__。不过我不确定我的答案,所以我会把它作为评论留下,让其他人详细说明。

标签: python object methods attributes scipy


【解决方案1】:

e.He.Ae.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 可能访问_shapeset_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__ 方法中定义的这些特殊的。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2019-05-07
    • 1970-01-01
    • 2013-02-27
    • 2013-10-31
    • 1970-01-01
    • 2021-09-08
    • 2012-05-30
    • 2019-09-05
    相关资源
    最近更新 更多