在学习Python会发现,类的方法(构造方法和实例方法)中都会有一个固定参数self 。 

为了说清楚 self 是个什么东西,首先需要搞清实例与类之间的关系。

人类是一个学术概念,把每个人共有的属性抽象出来形成的概念。而每一个人有名字,身高,体重等属性,不同人这些属性都是不一样的,除此之外,人还有很多方法(功能),例如,思考、跑步、睡觉等等。 类和实例的关系,就像是 人类和 张三之间的关系。

我们定义一个类,Person类有两个属性:姓名和年龄;有三个方法:会跑、会思考、会睡觉。

class Person():
    def __init__(self, name,age):
        self.name = name
        self.age  = age
    def run(self):
        print(f"{self.name} is runing")
    def think(self):
        print(f"{self.name} is thinking") 
    def sleep(self):
        print(f"{self.name} is sleeping") 

# 属性:一般是对象的特征、组成部分,是一个变量,例如数组对象的长度,汽车对象的颜色等;
# 方法:一般是对象所要做的动作,例如规定汽车行驶的run()方法。

人类是一个Python类,每个个体的人代表着实例(对象),而每个人的身份证代表的Python中self,每个人可以凭借身份证去做核酸、乘火车、住酒店...(方法),而Python中的实例对象也可以凭着self去调用类的方法。

zhangsan = Person("zhangsan",18)

我们构造了一个叫"张三"、年龄18岁的人,有两个属性,它是Person的实例对象。

现在我们调用Person类中的run方法,用 「实例.方法」的形式调用。

>>> zhangsan.run()
zhangsan is runing
# zhangsan替换了{self.name},self参数指代实例对象本身。

>>> zhangsan.run
<bound method Person.run of <__main__.Person object at 0x000002748206EE80>>
# 显示zhangsan绑定了Person类中的run方法。

我们看到输出结果中, zhangsan替换了{self.name},self参数在这里指实例对象本身调用方法时,会把当前实例对象自己作为参数传递给调用方法。

run方法与当前实例对象(zhangsan)进行了绑定,意味着 调用run()时不再需要传递参数,调用时python会自动把 “张三” 作为参数传递给run方法。

那为什么要叫self呢?其实这是约定俗成的,你叫其他名字也没关系。

总结:

      类实例化后,self就是指实例对象。当某个实例对象调用类方法时,实例对象凭借self去调用类方法。该对象会把自身作为第一个参数自动传给该方法,而这第一个参数就是self。

引用:

  1. 朱卫军 知乎 《一文读懂Python中self用法》

  2. 刘志军 知乎《大家是如何理解Python中的self?》

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐