之前记录过一篇《【扫盲】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. 总结
- 多个相类似的函数可以封装成一个类,类里面的方法功能跟前面的函数功能是一样的
- 类的外面调用方法,先要返回实例,如main函数里的opera0 = Calculator(),opera 就是Calculator这个类的实例参数
- 类里面调用自身方法,也是一样要有实例,self 就是类自身的实例
- 实例化的时候,会先执行初始化init的内容
网友评论