首先我们要搞明白Python的类中为要什么要用到self这个单词呢,为什么不用"zhangsan"、"lisi"这样的名字呢,这可定有他的用意。查Google翻译解释:
self 名词的解释:自;自我;自己
那么问题来了,这里的自己指代的到底是谁,下面听我详细分解。
分析
测试代码以一下这个代码及其它的扩充为基础,先贴代码,为了好理解,别说了半天不知道我在说什么。
classA(): defsong(one): print(one) defsing(self,one): print(one)
1、首先要搞清楚的一个问题 a=A()与a=A,这两个赋值之间的区别
a=A() print(a) a=A print(a) print(A) 结果如下: <__main__.Aobjectat0x0000020A69C81780> <class'__main__.A'> <class'__main__.A'> 分析: a=A()是有地址的,这说明他是一个实体,比如inta中的a一样 a=A是没有地址的,发现他和A打印的结果一毛一样,这说明他就是A,也就是一个类名, 等价于上一句中inta中的int 那么也就是说下面这两语句是等价的 b=A()与b=a() ------------------------------------------------------------------------ 通过上面的分析,我们知道,a=A()相当于把A给实例化了,什么叫实例化呢,类比与inta, int什么都不能做,即int不能被赋值,不能进行算术操作等等,但是a可以(其实这里的A与int 是一样的,追溯到C语言,类只不过是一种自定义的结构变量而已,只不过功能更加强大)。 那具体怎么个实例发呢?
2、self 到底指代的是谁
classA(): defsong(one): print(one) defsing(self,one): print(one) a=A() A.sing(a,"hello")#注意这条语句 a.sing("hello") 打印结果: hello hello ------------------------------- A.sing("hello") 错误信息: TypeError:sing()missing1requiredpositionalargument:'one' 提示没有给one赋值 -------------------------------- a.song("hello") 错误信息: TypeError:song()takes1positionalargumentbut2weregiven 那么问题来了,多给了一个什么参数,为什么会多给呢? -------------------------------- 把类A改一下 classA(): defsong(one,two):#注意这里多给song了一个参数 print(one) a.song("hello")//这里的参数"hello"赋给了two print(a) 打印结果: <__main__.Aobjectat0x0000020A69C39CC0> <__main__.Aobjectat0x0000020A69C39CC0> 是不是很奇怪,为什么a.song("hello")返回的是实例a的地址呢?
从这个例子中你就可以发现,实际上 a.sing(“hello”) 等价于 A.sing(a,“hello”),而self就是实例 a 自己,而且你发现 self ,也可以用别的单词来代替。
通过这段分析,我们简单的知道了,类中的方法第一个参数必须是 self ,不然实例无法正确调用类中的方法,也就是说,如果方法中第一个参数不是 self(广义的),那么这个方法是没有任何价值的,因为实例无法调用它,一个无法被调用的方法真不知道有什么用。
参数前面的 self
x=6 classA(): defsing(self): self.x=10 defmutl(self): y=10*x print(y) a=A() a.mutl()
这里先猜一下结果,到底会打印 60 呢,还是 100 呢?要弄清这个问题,就要先弄清 mutl() 中的 x 到底是哪一个,先看结果在分析。
结果是:60
为什么不调用类内部的 x 参数而跑去调用类外的 x 呢?还是那个问题,self 到底指代的是谁,self 就是 a 本身,那么问题就很明显了,mutl() 方法中的 x 前面没有加 self 所以他调用的不是实例(注意这里说的是实例,而不是类)自身的参数。
到这里我想你大概明白了,参数前面有self和没self的区别了,简单说,带self的参数是人家实例自身的,不带self的,爱谁谁,实例不管。
self相关内容推荐阅读:
self在函数中使用
python什么时候加self?
原文来自:https://www.py.cn
暂无评论内容