0. 写在前面

  • self的作用: 类实例化多个对象的时候,通过self确保访问到自己对象的数据
  • self蕴含了指针的思想,可以理解为它指向了当前对象
  • self不是关键字,但是python强烈推荐的。当然,你也可以使用其他字母,例如a,b。
  • self在实例化对象时会自动传入,不需要声明该参数

1. 预备知识

python的类有三个相关概念:属性(即变量)、方法(即函数)、继承

(1)属性

  • 如果变量定义在类下面而不是类的方法下面,那这个变量既是类的属性也是类实例的属性。
  • 如果变量定义在类的方法下面,如果加了self,那这个变量就是类实例的属性,不是类的属性;如果没有加self,这个变量只是这个方法的局部变量,既不是类的属性也不是类实例的属性

(2)方法

  • 如果在类中定义函数时加了self,那这个函数是类实例的方法,而不是类的方法。若想通过类名调用该方法,则需要传入一个对象
  • 如果在类中定义函数时候没有加self,那这个函数就只是类的方法,而不是类实例的方法

(3)继承

  • 这里不讲

2. 实例化的过程

  • 这个过程很重要,用个栗子进行讲解
class Person():
	def __init__(self,name,age,gender):
		self.name=name
		self.age=age
		self.gender=gender
	
	def walking(self):
		print("{} is walking".format(self.name))

tom = Person(name='tom',age=10,gender='male') # 实例化过程
tom.walking() # tom is walking
  • 首先我们定义了一个类Person,里边有三个对象属性和一个对象方法
  • 其次,实例化过程(__init__函数的作用)会创建一个Person对象,并为其分配内存空间,并让变量tom指向这个对象,这个内存空间肯定有一个地址,而self就是这个地址(指针),指向当前对象的内存空间。我们肯定还记得可以通过对象或者指向对象的指针调用该对象的方法或者属性。
  • self在创建对象的时候自动传入,无需声明
  • tom.walking()这一步会调用类中方法walking(self),此时该对象的地址(self)被传入该方法中,并且通过self.name可以访问到对象的name属性。

3. 总结

self就是一个指针,实例化对象的时候会自动创建一个指针(self)指向当前对象。