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