今天来谈一谈关于类的内容。在开始之前先简单的了解一下类,类对象以及实力对象的区别。个人觉得一句话还是很有道理的,python无处不对象。下面看一张图。类对象实际为类定义完成的产物。
说明一下图一就是一个错误的例子,但是结构上是没哟问题的,这是为了引出下面的问题,提示:图一会报NameError: name ‘a_x’ is not defined错误 。很明显在init中没有定义a_x 与b_x
从上面的那张图中可以发现,我们所说的类应该是包含属性(变量)和方法(函数),但是上图中并没有体现出这两者。但我个人觉得def__init__(self)就是属性的一种变形式,虽然图中写的是:实质为方法,人家确实就是函数嘛!然而这时我个人目前的理解。为什么这么理解呢,我给出了一下是两个理由:
1、init通常是用来定义一些变量的初始化值,属性不就是变量吗?
2、init定义变量时,需要赋初值,这里的初值指的是在def那一行中给值,初值数量定义变量数少一个,少的就是那个self。如def init(self,a =0 , b= 0, c = 0),这边定义了a, b, c 三个变量,那么在‘方法体’内也需要定义三个变量,定义的形式为 self.a = a。为什么只这种形式呢?我的理解是:在程序跑起来是,init是自动被加载的,所以在实例化对象的时候需要赋初值,而这个值就是通过参数a传递给self.a,在之后的方法中就可以使用self.a这个参数。看下面一张图关于参数传递过程:
如果在理由2中定义的三个变量但是都没有给赋初值或赋值的数量不够多,就会出现TypeError: init() takes 1 positional argument but 3 were given。大概的意思就是init中需要给三个初值,你给的不够呗。
然而还存在一个问题,什么问题。self.a我该怎么去用它呢?我们定义了self.a肯定是要使用的。下面我们就来聊一聊关于参数的使用。
初学者看教程的时候都觉得这不很简单,这有什么讲。但是对于我这种编程菜鸟我觉得还是有必要记录一下,哈哈。相信不少初学者听说这个init功能很强大,所以总想着在自己的程序里面也使用,提高程序的逼格,反正我就是怎么想的。
刚开始的时候最容易出现的问题就是,使用了init发现即使我怎么改变init之后的方法(定义的函数)发现在init中定义的参数值就是原始定义的,怎么都不变。顿时不想要高逼格的init了。**出现这个问题是主要是因为你在实例化对象的时候参数没有给值,所以你在init中的所给定的参数值会雷打不动,如def init(self.a =0 , b= 0, c = 0)它的a, b, c永远都是0,如果你 xx = xxxx(1, 2, 3),此时你的self.a = 1, self.b = 2, self.c = 3。**简单说明一下,xx表示实力对象名称,xxx表示类名称。此时你的self.a = 1, self.b = 2, self.c = 3就会随着编译的顺序往下传。**也就是说你要改变self.a, self.b, self.c 的值,你必须每次都得xx = xxxx(1, 2, 3)这种形式去做。**如下图所示: