美文网首页
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