为什么形状是属性和函数而不是数组方法?

时间:2015-02-25 18:19:19

标签: python arrays numpy

经验丰富的R用户,相对较新的Python用户。

如果达成一致意见,这将是一个太多的意见/设计师问题,将删除。

我真的很好奇为什么shape是numpy模块中的数组和函数的属性,而不是数组对象的方法。换句话说,

import numpy as np
a = np.array((1,2,3))
np.shape(a)   ## call function
## (3,)
a.shape       ## retrieve attribute
## (3,)
a.shape()     ## pretend that it's a method
## Traceback (most recent call last):
## File "<stdin>", line 1, in <module>
## TypeError: 'tuple' object is not callable

很明显,近端,为什么最后一种方法不起作用(因为a.shape返回(3,)然后我们正在尝试计算(3,)()) ,但我不明白设计 - 非常天真,我原本期望形状方法成为最恐怖的。

1 个答案:

答案 0 :(得分:5)

正如aruisdante所说,PEP 8说:

  

对于简单的公共数据属性,最好只公开属性名称,而不使用复杂的访问器/ mutator方法。

我认为实际的惯例甚至比这更多。如果您从对象获得的只是静态数据,则无需将其作为方法;它可以只是一个属性。也就是说,如果对象附加了已经计算和存储的数据,则可以将其存储为属性。在检索所需数据时,更常用的方法是每次检索时都需要进行某种实际计算。 (即使在简单的属性访问中,属性也允许“透明”计算,因此obj.attr实际上运行一个函数来计算结果,但是对于任何繁重的计算使用它都会被认为有点偷偷摸摸。)当然,如果你需要传递参数以获得你想要的数据,它必须是一个函数/方法(这就是为什么np.shape是一个函数)。这里肯定存在意见分歧的范围,并且确实有些库在属性与方法之间有所不同。

因此,由于shape是数组的一个简单固定特性,因此它不需要是一个方法。