2024-04-25 19:27:32 发布
网友
我只是想把我的大脑集中在这里的语法上:
# 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
为什么有些方法/函数有括号,而有些没有?在
当您访问实例的属性时,实际上是在访问描述符。常见的情况有三种:
描述符返回一个像x.sum这样的函数,它返回一个绑定函数。绑定,因为该函数的第一个参数将是x。显然,您需要调用()该函数来给出一个结果。
x.sum
x
()
有一些类和实例属性,它们只返回保存在x.__dict__或{}中的值。你不需要打电话就可以得到这些。然而x.shape不是其中之一!
x.__dict__
x.shape
有properties,当你访问这些文件时,它会隐式地调用你的类的一个方法。在一般属性中,比如x.something,相当于x.__class__.something.fget(x)。看起来很奇怪,但很管用。。。某种程度上。这里重要的一点是,通常不需要直接调用它(),因为您只需执行x.something。
properties
x.something
x.__class__.something.fget(x)
但这是技术性的,也许更简单的解释最好记住:
sum
shape
tuple
当您访问实例的属性时,实际上是在访问描述符。常见的情况有三种:
描述符返回一个像
x.sum
这样的函数,它返回一个绑定函数。绑定,因为该函数的第一个参数将是x
。显然,您需要调用()
该函数来给出一个结果。有一些类和实例属性,它们只返回保存在}中的值。你不需要打电话就可以得到这些。然而
x.__dict__
或{x.shape
不是其中之一!有
properties
,当你访问这些文件时,它会隐式地调用你的类的一个方法。在一般属性中,比如x.something
,相当于x.__class__.something.fget(x)
。看起来很奇怪,但很管用。。。某种程度上。这里重要的一点是,通常不需要直接调用它()
,因为您只需执行x.something
。但这是技术性的,也许更简单的解释最好记住:
sum
是一种方法。应调用方法。要调用函数或方法,您需要()
。在shape
是一个属性(但也可以是一个属性),您不需要调用这些属性!它也可以返回一个函数,但在本例中,它返回一个tuple
并且不能调用tuple
实例。在相关问题 更多 >
编程相关推荐