|
发表于 2022-2-21 19:32:44
|
显示全部楼层
本帖最后由 isdkz 于 2022-2-21 19:51 编辑
访问变量有两种类型:
1、全局与局部:(直接 XXX 访问)
在局部找不到,就到全局找
2、类与对象:(要以 XXX.XXX 的方式访问)
在对象中找不到,就到类中找
你可以看一下下面这两个代码:
- class Test():
- a = 5
- def test(self):
- print("self: ", self)
- print("self.a: ", self.a)
- print("test: ", test)
- print("test.a: ", test.a)
- a = Test()
- a.test() # 调用a的test方法,a的test方法打印 test 变量,因为局部没有,所以到全局找,全局没有,就报NameError了
复制代码
- class Test():
- a = 5
- def test(self):
- print("self: ", self)
- print("self.a: ", self.a)
- print("test: ", test)
- print("test.a: ", test.a)
- test = Test()
- test.test()
- """ 调用test对象的test方法,test对象的test方法打印 test 变量,因为局部没有,所以到全局找,
- 正如前面说的,它在局部中找不到是到全局中找的,而不会到类中找到 test 方法,因为属性和方法都是要用 XXX.XXX 的方式来访问的
- 找到了test对象并把它打印出来,可以看到test跟self是一样的,因为解释器会把它自身传给实例方法的第一个参数,也就是self,
- 所以在实例的方法里面可以通过 实例的名字来使用它的属性,就像上面的代码里面的 test.a,也可以使用self来使用它的属性,就像上面代码的 self.a,
- 但是实例在被实例化之前都不会知道它自己叫什么名字,就像第一段代码一样用了 a,test不存在,就报NameError了,所以在类里面定义它的方法的时候使用到它本身的变量都会用self,因为解释器会自动把self也就是调用者自身传入。"""
复制代码 |
|