真正理解Python中的self

一、理解给对象添加属性

class Hero(object):
    def set_info(self):
        # 下面定义的了3个实例属性,且给它们设置了初始值
        self.name = "王老师"
        self.age = 18
        self.address = "山东青岛"

    def print_info(self):
        print(self.qq, self.email)


# 创建实例对象
hero = Hero()
# 调用方法,从而让第4、5、6行被执行,从而完成实例对象的属性添加
hero.set_info()
# 通过对象方式直接获取属性
print(hero.name, hero.age, hero.address)
# 给对象添加额外的属性
hero.qq = 123456
hero.email = "dong4716138@163.com"  # 这是王老师真实的邮箱哦....
# 调用方法,在方法中获取qq、email
hero.print_info()

说明:

  • 创建对象后,变量hero指向了一个空间,这个空间可以理解为对象空间
  • 对象中可以存放添加了所有的属性

image-20200912124217386

二、方法获取属性

image-20200912125537762

注意:

  • 实例对象.实例方法()就相当于实例方法(实例对象)
  • 定义实例方法的时候,之所以第一个形参一定是self就是因为,当我们调用实例方法的时候Python解释器会自动将这个对象的引用当做第一个实参

三、self的作用

通过上述的学习,大家能够看出,self的作用就是当通过实例对象调用方法的时候self能够自动指向实例对象,从而拥有了操作这个对象中的属性或者方法的可能

示例

class Cat(object):
    def set_info(self, new_name, new_age):
        self.name = new_name
        self.age = new_age

    def eat(self):
        print("%s在吃鱼...." % self.name)

    def drink(self):
        print("%s在喝可乐..." % self.name)

    def introduce(self):
        print("名字是:%s, 年龄是:%d" % (self.name, self.age))


# 创建对象
tom = Cat()
# 调用方法,设置属性
tom.set_info("汤姆猫", 30)
# 调用实例方法
tom.eat()
tom.drink()
tom.introduce()

说明:

image-20200912130948101

四、案例:多个对象

class Cat(object):
    def set_info(self, new_name, new_age):
        self.name = new_name
        self.age = new_age

    def eat(self):
        print("%s在吃鱼...." % self.name)

    def drink(self):
        print("%s在喝可乐..." % self.name)

    def introduce(self):
        print("名字是:%s, 年龄是:%d" % (self.name, self.age))


# 创建对象tom
tom = Cat()
# 调用方法,设置属性
tom.set_info("汤姆猫", 30)
# 调用实例方法
tom.eat()
tom.drink()
tom.introduce()


# 创建对象jia_fei
jia_fei = Cat()
# 调用方法,设置属性
jia_fei.set_info("加菲猫", 18)
# 调用实例方法
jia_fei.eat()
jia_fei.drink()
jia_fei.introduce()

说明 image-20200912131934243

五、总结

  • 所谓的self,可以理解为自己,谁调用方法中的self就指向谁
  • 可以把self当做C++编程语言中类里面的this指针一样理解,就是对象自身的意思
  • 某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
  • self仅仅是一个变量名,也可将self换为其他任意的名字,但是为了能够让其他开发人员能明白这变量的意思,因此一般都会self当做名字