美文网首页
理解python 成员函数、@staticmethod和@cla

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

作者: 正向反馈 | 来源:发表于2019-03-27 11:21 被阅读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逻辑

    相关文章

      网友评论

          本文标题:理解python 成员函数、@staticmethod和@cla

          本文链接:https://www.haomeiwen.com/subject/xmnavqtx.html