一直以来,对statismethod和classmethod的理解比较模糊。
结合javascript
来理解,就很清晰了。
以下两个例子。 首先是javascript
的例子
class A{
hi(){
console.log(this)
}
hi2 = () =>{
console.log(this)
}
}
let a = new A()
let hi = a.hi
hi()
let hi2 = a.hi2
hi2()
然后是 python
的例子
class A:
def hi(self):
print(self)
a = A()
hi = a.hi
hi()
其实都是同一个问题,成员函数怎么访问到对象的问题。
js
里成员函数就是普通函数,所以函数内部访问this
,此时this
指向的是调用者。上述例子就可以看出,我们将成员函数赋给一个变量,然后直接调用,这时候this
指向就不是a
对象了。
js
箭头函数通过闭包,锁定了a
对象,函数内部的this
就固化成a
对象了
python
采用另一套思路,类似于柯里化,在类里声明的成员函数,在实例化时,经过柯里化,将对象固化到第一个参数之上。
class B:
def hi():
pass
B().hi()
这时会报错的,说hi
函数位置参数不匹配,就是因为self
被固化到参数1上了,但hi
函数声明没有参数1。
@classmethod
返回不同的固化参数1为Class
的新的函数,避开默认的固化self
逻辑
@staticmethod
返回没有固化参数的新的函数,避开默认的固化self
逻辑
网友评论