经验丰富的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,)()
) ,但我不明白设计 - 非常天真,我原本期望形状方法成为最恐怖的。
答案 0 :(得分:5)
正如aruisdante所说,PEP 8说:
对于简单的公共数据属性,最好只公开属性名称,而不使用复杂的访问器/ mutator方法。
我认为实际的惯例甚至比这更多。如果您从对象获得的只是静态数据,则无需将其作为方法;它可以只是一个属性。也就是说,如果对象附加了已经计算和存储的数据,则可以将其存储为属性。在检索所需数据时,更常用的方法是每次检索时都需要进行某种实际计算。 (即使在简单的属性访问中,属性也允许“透明”计算,因此obj.attr
实际上运行一个函数来计算结果,但是对于任何繁重的计算使用它都会被认为有点偷偷摸摸。)当然,如果你需要传递参数以获得你想要的数据,它必须是一个函数/方法(这就是为什么np.shape
是一个函数)。这里肯定存在意见分歧的范围,并且确实有些库在属性与方法之间有所不同。
因此,由于shape
是数组的一个简单固定特性,因此它不需要是一个方法。