为什么shape是一个属性和函数,而不是数组的方法?

2024-04-29 12:48:00 发布

您现在位置:Python中文网/ 问答频道 /正文

经验丰富的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

很明显,proximally,为什么最后一种方法不起作用(因为a.shape返回{},然后我们试图计算(3,)()),但我不理解这个设计——非常天真,我本以为shape方法是最具python风格的。在


Tags: 模块对象方法函数用户importnumpy属性
1条回答
网友
1楼 · 发布于 2024-04-29 12:48:00

正如阿鲁伊斯丹特所说,PEP 8说:

For simple public data attributes, it is best to expose just the attribute name, without complicated accessor/mutator methods.

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

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

相关问题 更多 >