类比和形象解释:
假设你有一张学生表,每个学生有自己的名字、年级等信息。self
就好像是每个学生自我介绍时的“我”,比如说:“我是张三,我的年级是二年级”。
在编程里,通过 self
,实例就可以“知道”自己的名字、年级等属性是什么,并且能调用自己专属的方法。是不是每个人都会自称“我”?所以这就让每个人都能适用上了
它就像java中的this
例子:
我们来看一个简单的类和如何用 self
。
class Student:
def __init__(self, name, grade):
# 初始化方法,用来定义实例的初始状态
self.name = name # self.name 是实例的名字
self.grade = grade # self.grade 是实例的年级
def introduce(self):
# 使用 self 来访问实例的属性
return f"Hi, I am {self.name} and I am in grade {self.grade}."
# 创建一个 Student 类的实例
student1 = Student("John", 3)
# 调用 introduce 方法
print(student1.introduce())
__init__
是一个特殊的方法(构造函数),在创建类的实例时会被调用。self.name = name
的意思是“这个实例的名字属性等于传入的名字参数”。- 当我们调用
student1.introduce()
时,Python 自动把student1
作为self
传递给introduce
方法。所以在方法内部,self.name
实际上就是student1
的名字属性。 - 也就是说给每个传入的参数都定义了
没有 self
的对比:
如果我们不使用 self
,类的方法和属性就不知道是哪个实例的。所以 self
是必须的,表明你在操作的具体是哪个对象。
更形象的解释:
如果你和一群同学在一起,而你要向别人介绍自己,你会说“我是小明”而不是“他是小明”。同样,self
就像是类中的实例在说:“我自己是谁、我有什么属性和能力”,而不是在说别人。
理论知识
python中,self
是一个类的方法(构造函数)中第一个参数,表示实例自身。
与普通的函数相比,在类中定义的函数只有两点点不同:
1、第一个参数永远是 self ,并且调用时不用传递该参数
2、在类中函数相互调用要加 self ,不加 self ,会报错: 函数未定义
除此之外,类的方法和普通函数没有区别
简单来说,self让类的方法能够访问属于该实例的属性和方法。我们可以把 self
想象成你在类内部给实例(实参)的“自我指代”,表示这个实例“我自己”的什么什么性质。
和c语言对比
而在c语言中并没有可类比的,这是因为self是面对对象oop。
在 C 语言中,结构体(struct
)可以用于定义某种数据类型,它可以包含多个字段。我们可以把它类比成 Python 中的类。区别是,C 语言中的 struct
只是数据的集合,不包括方法(函数)。
-
在 C 中,结构体
Student
用来存储数据,函数introduce
接收结构体的指针,通过指针访问结构体的成员。 -
在 Python 中,类
Student
是数据和方法的结合体,self
自动代表类的实例,相当于 C 语言中手动传递的结构体指针。 -
在 C 语言中,你必须手动传递指针给函数,这样函数才能操作具体的结构体实例。在 Python 中,
self
就是这个实例指针,Python 自动把它传递给类方法。