0
点赞
收藏
分享

微信扫一扫

python面向对象-对象方法的self参数是什么意思

搬砖的小木匠 2022-03-12 阅读 170

Python教程《零基础入门学习Python》最新版(爬虫+办公自动化+数据分析)_哔哩哔哩_bilibili

本节课我们就来讲讲self参数的用途

要讲清self参数,就要从面向对象的特性:封装给大家讲讲

面向对象的封装特性,其中就包含,

对象要能够 操作自己的数据

那么,对象要怎样才可以操作 自己的数据呢?

前面我们知道了, 如果对象名 是 a, 如果要访问a的age属性,

我们就会写成a.age

但是在 设计 类的时候, 用什么方式来表示 要访问a的age属性呢?

class 人:
    age = 0
    def 变老一岁():
        a.age = a.age + 1

假如这个 类,将来要实例化成 a,b,c,d,e,f ...

100多个对象,那怎么在设计图上表示出这100多个对象呢?

后来,经过语言的不断发展,有了办法

我们可以在 这个方法中,传入一个特殊参数,对象自己

class 人:
    age = 0
    def 变老一岁(对象自己):
        对象自己.age = 对象自己.age + 1

这个特殊参数对象自己,就和汉语中的  具有一样的功效

张三说:"我有10元钱", 这里,张三口中的  是指谁?是张三
李四说:"我有5元钱", 这里,李四口中的是指谁?是李四

你可以发现,不同的人口中的 , 代表了不同的对象,谁说了,谁就是那个对象

如此一来, 当我们实例化这个类后, 执行这个 变老一岁 的方法后, Python就知道,我们要把谁的age加1

现在让我们实例化2个对象试试

张三 = 人()
李四 = 人()

当我们执行这2行代码,实例化2个人之后, 就会形成这样2张 虚拟的数据表

为什么他们2个没有age这个属性?

因为age这个属性,是类的属性, 对象默认是没有的

接着,让我们执行一下 张三.变老一岁()

当我们执行 张三.变老一岁() 的时候

就会把 张三的age加1,但是张三没有age 这个属性,于是 Python就去找找看,张三的类有没有age,有的话就拷贝过来

结果Python发现,张三所属的 人 这个类, 果然有个 age属性,值为0.,于是就拷贝一份过来

现在 张三的age为0, 执行这行代码后,张三的age就是1了

现在我们来打印下 张三的age看看

print(张三.age)

现在,你知道,为什么要 定义类的时候,有些方法必须传入一个特殊参数,来表示 被实例化的对象 了吧

就是为了,方便 实例化以后,操作对象自身的属性

我们定义的类里, 那个特殊的参数名,我们起的名字是对象自身,这个名字你可以随便起个什么名字

但是行业里,大家约定了 使用self 这个名字, 所以,强烈建议你,也用这个名字

定义类的时候,并不是所有方法,都必须要传入self参数,只有当你想要在这个方法 内部操作 对象的时候,才需要传入self

对于 需要 在方法内部操作对象的方法,我们叫做 对象方法, 也可以叫做实例方法

那么,那些不需要在方法内部操作对象的方法 有 类方法、还有静态方法, 这2个方法 以后我们会讲到

反正你以后见到的类, 如果类里面的方法, 第一个参数是self, 那么99%可以肯定是对象方法,另外那1%肯定是写代码的程序员瞎写,不按照规矩来

刚才我们讲过了 定义类的时候,

对象方法,必须要传入一个self参数,我们也知道,self就代表这个对象自身,那么怎么证明呢?

先来写个小例子,证明 self 等于对象自身

class TestSelf:
    def self_id(self):
        return self # 返回self自身

这里我们创建了一个类,它有一个方法self_id,这个方法会返回self参数

接着,我们来实例化这个类

t1 = TestSelf() # 实例化为一个对象t1
print(t1) # 打印t1对象自身,
print(t1.self_id()) # 打印t1对象的self_id方法的返回值
# 输出
# <__main__.TestSelf object at 0x1055afbe0>
# <__main__.TestSelf object at 0x1055afbe0>
print(t1 is t1.self_id()) # 使用is判断他们的指向是否一致
# 输出
# True

通过我们的代码验证得知,self 确实是 实例化后的那个对象自身,它不是类,也不是别的, 就是对象自己

既然我们知道了,self代表的是对象自己,那么,对象拥有的属性和方法,self一定也拥有 对吧?

我们来验证一下, 先改写一下 之前的代码

class 鸭类设计方案:
    type_name = "鸭"

    def 吃东西(self):
        print("开始用嘴巴吃东西")
    def 跑(self):
        print(self.type_name, ":用2条 后肢 跑")
    def 叫(self):
        print("嘎嘎嘎")
    def 验证自己(self):
        print(self.type_name) #打印自己的type_name属性
        print(self.url) # 打印自己的url属性
        self.吃东西() #执行自己的吃东西 方法
        self.跑() # 执行自己的跑 方法
        self.叫() # 执行自己的叫 方法

我们给这个类,新增了一个叫做验证自己的对象方法, 在方法内部,通过self访问自己的属性和方法

y1 = 鸭类设计方案()
y1.验证自己() # 调用对象的 验证自己 方法
# 输出
# 脾气猪
# www.piqizhu.com
# 开始用嘴巴吃东西
# 脾气猪 :用2条 后肢 跑
# 嘎嘎嘎

我们发现,运行正常,对象拥有的方法和属性,我们在对象内部,都可以通过self.来进行访问

所以, self 就是对象自身

举报

相关推荐

0 条评论