我只是想绕过这里的语法:
# some data
import numpy as np
x = linspace(0, 1, 100)
x.sum() # works with brackets
> 50.0
x.shape # works without brackets
> (100,)
x.shape() # fails with brackets
> TypeError
为什么有些方法/功能有括号,而有些方法/功能没有?
答案 0 :(得分:3)
当您访问实例的属性时,您真正访问了描述符。有三种常见情况:
描述符返回类似x.sum
的函数,它返回一个绑定函数。绑定,因为该函数的第一个参数将是x
。你显然需要调用()
函数来给你一个结果。
有类和实例属性,只返回保存在x.__dict__
或x.__class__.__dict__
中的值。你不需要打电话给任何东西来获得这些。但是x.shape
不是其中之一!
有properties
,当您访问这些内容时,隐式会调用您班级的方法。在一般属性中,比如说x.something
,等同于x.__class__.something.fget(x)
。看起来很奇怪,但有点......重要的是,您通常不需要直接调用()
,因为您可以x.something
。
但这是技术性的,也许更简单的解释更好记住:
sum
是一种方法。应该调用方法。要调用函数或方法,您需要()
。shape
是属性(但也可以是属性),您无需调用它们!它也可以返回一个函数,但在这种情况下,它返回一个tuple
,你不能调用tuple
实例。