理解python 成员函数、@staticmethod和@cla

2019-03-27  本文已影响0人  正向反馈

一直以来,对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逻辑

上一篇 下一篇

猜你喜欢

热点阅读