Python self用法详解

什么是self?

在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数,self 到底扮演着什么样的角色呢?

通俗解释

  • 举个栗子:
    如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人。
  • 如何对它们进行区分呢?
    当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。

代码理解

同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。

class Students:
    def __init__(self):
        print(f"正在执行{self}构造方法")

    def say(self, content):
        print(self, content)

jim = Students()       # 初始化jim实例
jim.say('这是jim的实例') # 调用jim实例的say方法,此时的self为"jim"

tom = Students()       # 初始化tom实例
tom.say('这是tom的实例') # 调用tom实例的say方法,此时的self为"tom"

peter = Students()       # 初始化peter实例
Students.say(peter, '这是peter的实例') # 调用Students类的say方法,将peter对象传入,此时的self为peter

Students.say('测试', '这是测试的实例')  # self传入的不是对象,而是字符串,未创建实例而是直接调用,所以没有执行init函数

运行结果:
正在执行<__main__.Students object at 0x104ce52b0>构造方法
<__main__.Students object at 0x104ce52b0> 这是jim的实例

正在执行<__main__.Students object at 0x104e4ef28>构造方法
<__main__.Students object at 0x104e4ef28> 这是tom的实例

正在执行<__main__.Students object at 0x104e0b4e0>构造方法
<__main__.Students object at 0x104e0b4e0> 这是peter的实例

测试 这是测试的实例
posted @ 2022-05-03 01:24  大切切  阅读(833)  评论(0编辑  收藏  举报