在Python中使用括号或不使用括号的函数?

3
在Python中,有一些需要括号,而另一些则不需要,例如考虑以下示例:
a = numpy.arange(10)
print(a.size)
print(a.var())

为什么size函数不需要用括号括起来,而方差函数需要?这背后是否有通用的规则,还是每个函数都需要记忆?此外,有些函数在参数之前写(与上面的例子相反),例如:
a = numpy.arange(10)
print(np.round_(a))

为什么不写.round_.round_()

2
这里的 size 不是一个方法/函数,而是一个 属性,因此不需要括号,因为它没有被“调用”。(我意识到它可能是一个描述符,但这显然超出了范围)。更完整的答案可能会解释,sizevar 都是以类似的方式被查找,然后调用了 var - jedwards
np.round_(..) 因为你调用的方法属于 np 而不是 ndarray a - 你不需要记住它们,可以查阅文档:https://docs.scipy.org/doc/numpy-1.13.0/reference/ - 方法需要 (),属性则不需要。 - Patrick Artner
2个回答

4
听起来你对三个不同的概念感到困惑,这些概念不仅适用于Python,而且适用于(面向对象)编程。
  • 属性是对象的值和特征。例如array.shape
  • 方法是对象可以运行的函数和执行的操作。例如array.mean()
  • 静态方法是属于一个对象类的函数,但不需要对象才能执行,例如np.round_()

看起来你应该了解面向对象编程:这里有一份关于Python方法的入门指南


此外,一种更符合Python风格的特殊属性是property。它们是对象的方法,不使用()进行调用。听起来有点奇怪,但可能很有用;请深入了解它。

其实,面向对象编程并不只是关于属性和方法的;为了这个目的而阅读所有关于面向对象编程的内容是过度杀伤力的。 - Display Name
同意;如果您跟随链接,它并不是关于通用面向对象编程的,也许我应该更新。 - ted

2

arrange 返回一个 ndarray 数组对象。 size 不是函数,而是 ndarray 类的属性。由于它只是一个值,不是可调用的函数,因此不需要使用括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接