美文网首页
Python3的参数化:关于 self 参数的详细解释(重温 i

Python3的参数化:关于 self 参数的详细解释(重温 i

作者: Queenie的学习笔记 | 来源:发表于2019-12-06 15:58 被阅读0次

    之前记录过一篇《【扫盲】18.关于Python中为什么要有init()函数?》,当时其实并没有完全理解 init 函数和self参数,最近从悠悠的博客(https://www.cnblogs.com/yoyoketang/p/9098096.html)中学习相关内容时,发现悠悠老师解释的非常好,虽然没有完全消化吸收掉,但是对于python的学习理解却大大加深了。以下是学习记录。

    1. 为什么几乎所有的类开始时都是先写 init 函数?

    当类中的每一个方法都需要传入相同的变量a和b的时候,代码看上去会比较冗余,就像下面的代码(注意这里的 add / subtract /variance方法都传入了参数a,b)。

    class Calculator():
    
        def add(self,a=0,b=0):  #这里的self是指调用Calculator这个类本身,作用同opera = Calculator()
            c = a + b
            return c
    
        def subtract(self,a,b):  #这里的self是指调用Calculator这个类本身,作用同opera = Calculator()
            d = a - b
            return d
    
        def variance(self,a,b):
            return self.add(a,b)*self.subtract(a,b) #这里其实就是return c*d
    
    if __name__ == '__main__':
        # 实例化的时候,会先执行初始化__init__的内容
        opera = Calculator()  #将类实例化,opera 就是Calculator这个类的实例参数
        print(opera.variance(5,1)) #打印出来的结果是24
    

    为了减少代码冗余,可以将a,b抽取出来放入公共的变量部分成为全局变量,即初始化 “init(self)”,例如下面的代码将变量放入 init 函数中,其他方法就只需要调用init函数里的 self.a 和 self.b 全局变量即可。
    (注意下面的 add / subtract /variance方法都没有再传入a,b变量)

    class Calculator():
    
        def __init__(self):
            self.a = 0  #这里a和 b 都写死,程序的运行结果无论如何都会是0,这里仅做理解用,这种写法是无意义的
            self.b = 0
    
        def add(self):
            c = self.a + self.b  #这里其实就是 c = 0 + 0
            return c
    
        def subtract(self):
            d = self.a - self.b  #这里其实就是 d = 0 - 0
            return d    
    
        def variance(self):
            return self.add()*self.subtract()   #这里其实就是 return 0*0
    
    
    if __name__ == '__main__':
        # 实例化的时候,会先执行初始化__init__的内容
        opera = Calculator()  #将类实例化,opera 就是Calculator这个类的实例参数
        print(opera.variance())  #打印出来的结果是0
    

    2. 为什么几乎所有的方法和代码里都能见到一个self参数?

    self 放在变量前,起到全局的作用,相当于Class类的参数。例如self.a和self.b 成为全局变量后,Calculator类下面的所有方法(add / subtract /variance)都使用这两个变量。

    class Calculator():
    
        def __init__(self,a=0,b=0): #这里传入灵活的形参,作用于整个Calculator类,初始化默认值a=0,b=0
            self.a = a  #形参可传可不传,传入取新值,不传则取默认值
            self.b = b
    
        def add(self):
            c = self.a + self.b  #这里其实就是 c = a + b,a和b是后面主函数中传入的参数
            return c
    
        def subtract(self):
            d = self.a - self.b  #这里其实就是 c = a - b,a和b是后面主函数中传入的参数
            return d    
    
        def variance(self):
            return self.add()*self.subtract()   #这里即 return c*d,c和d是根据主函数传入的a,b的值得出的运算结果
    
    
    if __name__ == '__main__':
        #实例化的时候,会先执行初始化__init__的内容
        opera0 = Calculator()   #不传参,默认使用a=0和b=0
        opera1 = Calculator(5,1)    #传参
        print(opera0.variance())    #不传参的结果,打印出来仍然是0
        print(opera1.variance())    #传参的结果,打印出来是24
    

    3. 总结

    1. 多个相类似的函数可以封装成一个类,类里面的方法功能跟前面的函数功能是一样的
    2. 类的外面调用方法,先要返回实例,如main函数里的opera0 = Calculator(),opera 就是Calculator这个类的实例参数
    3. 类里面调用自身方法,也是一样要有实例,self 就是类自身的实例
    4. 实例化的时候,会先执行初始化init的内容

    相关文章

      网友评论

          本文标题:Python3的参数化:关于 self 参数的详细解释(重温 i

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