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

v2-ff9451c4d437c24e799f974cc5baf56a.jpgpython 中的 self是什么意思https://www.zhihu.com/video/1112494348733833216

通过前面的课程里的知识

我们知道了, 定义对象(实例)方法的时候,必须要传入一个self参数,

那么为什么必须要传入这个self参数呢? 这个参数究竟有啥用呢?

本节课我们就来讲讲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 就是对象自身

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值