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

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的.

Bre*_*arn 5

正如aruisdante所说,PEP 8说:

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

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

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

  • 从属性优先心态开始的另一个好处是,您始终可以将属性转换为属性而不会破坏任何相关代码,但是一旦您决定创建一个方法,它必须保持这种生活方式,除非您想要导致你的用户很痛苦. (2认同)