开发者学堂课程【Python 入门 2020年版:Self 的介绍 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10368
Self 的介绍
内容介绍:
一、 创建对象语句的作用
二、def say_hello(self) 中 self 所指内容
一、 创建对象语句的作用
先创建一个新的 python 文件,命名为 07-self 语句的使用。
创建一个对象 s1 = Student(‘张三’,18),这段代码主要的作用是什么?
1. 调用__new__ 方法,这个方法是用来申请内存空间,在计算机中,对象就是内存空间的一块地址
代码内容如下:
class Student(object):
def __init__(self,x,y):
self.age = y
s1 = Student(‘张三’,18)
print(‘0x%X’ % id(s1))
运行后:
打印完后的地址如图显示
先解释 Student() 的用处,在内存中有一段空间就是刚刚打印出的地址,s1 = Student(‘张三’,18)
这段代码用来申请内存空间,告知内存需要空间,再由 cpu 查询。
内存就像是一个宾馆一样,有用户需要房间,它来查询空房间安排客户居住并开辟一个房间号,房间号就是内存地址。
2.在调用__init__方法,并让self指向申请好的那段空间
def __init__(self,x,y):
self.name = x
self.age = y
在调用的过程中会指向所在的空间,调用 self 后,还会调用函数。这块的 self 指的就是内存空间,self.name 就是代表这块内存空间下的 name 属性对应的是 x,x是调用对象时传进的张三,这个时侯传的参数就是张三传给 x,18 传给 y。
传完之后在 self.name 的值就写成了张三,而 self.age 的值就写成了 18,这两个数据就传进去。
在写的过程中写的是张三传给 x,18 传给 y,但在真正内存里张三传给 name,18传给 age,这就要看在 self 中到底定义的属性名是什么。
定义的是 name,存的就是 name;定义的是 age,存的就是 age。
过程分析图如下:
3. 让 s1 也指向创建好的内存空间
过程分析图如下:
s1 指向内存空间,用 s1.name 提取出 s1 的名字
代码如下:
class Student(object):
def __init__(self,x,y):
self.name = x
self.age = y
s1 = Student(‘张三’,18)
print(‘s1的名字是’ ,s1.name)
运行后结果如图:
此时,打印出了 s1 的名字是 张三
二、def say_hello(self) 中 self 所指内容
现在定义一个函数,注意函数的缩进
def say_hello(self):
print(‘大家好,我是’,self.name)
这个函数与其他不太一样,在前面的内容,都具有一样的属性。但除此之外还有另一块属性。先简单理解一下,在内存中有一个函数
def say_hello(self):
print(self.name)
这个函数保存在原来的 Student() 类,在明白调用时函数中的 self 指的是之前,再书写一个对象
s2= Student(‘jack’,21)
这时会开辟一个新的内存空间,同样的操作会有对应得到内存地址,并且每创建一个变量就有一个变量指向内存空间。
但是函数不一样,调用时它不会在每一个变量中保存一份,它只保存一份。通过self 来进行不同的调用,用self来绑定。
例如,将 s1 的 print 语句全部换成 s1.say_hello()
改后的代码整体变为
class Student(object):
def __init__(self,x,y):
self.name = x
self.age =
def say_hello(self):
print(self.name)
s1 = Student(‘张三’,18)
s1.say_hello()
s2= Student(‘jack’,21)
运行结果如下:
这个时候是属于想要调用就可以调用,是第一个对象 s1 对这个方法的调用,此时函数中的 self 就是 s1.也就是说谁调用这个函数,这个里面的 self 就是哪一个
同理,在 s2 下面添加语句 s2.say_hello(),并删掉 s1.say_hello() 语句
代码变为:
class Student(object):
def __init__(self,x,y):
self.name = x
self.age = y
print(self.name)
s1 = Student(‘张三’,18)
s2= Student(‘jack’,21)
s2.say_hello()
运行结果为:
这时就会是 s2 进行的调用函数,就会打印出 s2 的内容。
总之 self 就是哪一个调用的该方法就是哪一个,就是当前调用的对象是哪一个那么 self 就是哪一个,s1 调用 self 是 s1,s2 调用 self 是 s2。
这个东西和 java 中的 this 是类似的
下图为过程分析图: