Self 的介绍 | 学习笔记

简介: 快速学习 Self 的介绍

开发者学堂课程【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 查询。

内存就像是一个宾馆一样,有用户需要房间,它来查询空房间安排客户居住并开辟一个房间号,房间号就是内存地址。

image.png

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。

过程分析图如下:

image.png

3. 让 s1 也指向创建好的内存空间

过程分析图如下:

image.png

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 是类似的

下图为过程分析图:

image.png

相关文章
|
6月前
QuantLib学习笔记——InterestRate的应用
QuantLib学习笔记——InterestRate的应用
52 0
|
存储 Java 开发者
BinaryTree|学习笔记
快速学习BinaryTree
115 0
BinaryTree|学习笔记
|
机器学习/深度学习 算法 开发者
总结与回顾| 学习笔记
快速学习总结与回顾。
|
算法 开发者 索引
FuzzyQuery|学习笔记
快速学习 FuzzyQuery。
243 0
|
人工智能 算法 开发者
SDV 要解决的问题 | 学习笔记
快速学习 SDV 要解决的问题
|
开发者
SearchType 详解|学习笔记
快速学习 SearchType 详解。
260 0
|
负载均衡 开发者 索引
replicas|学习笔记
快速学习 replicas。
132 0
|
存储 开发者 Python
|
机器学习/深度学习 算法 数据处理
总结与练习|学习笔记
快速学习总结与练习。
|
存储 SQL 分布式计算
MaxCamputeInfomationSchema 详解 | 学习笔记
快速学习 MaxCamputeInfomationSchema 详解
238 0
MaxCamputeInfomationSchema  详解 |  学习笔记