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

https://www.bilibili.com/video/BV16R4y1G7hy?spm_id_from=333.999.0.0

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

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

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

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

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

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

我们就会写成a.age

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

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

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

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

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

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

class人:age=0def变老一岁(对象自己):对象自己.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 等于对象自身

classTestSelf:defself_id(self):returnself# 返回self自身

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

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

t1=TestSelf()# 实例化为一个对象t1print(t1)# 打印t1对象自身,print(t1.self_id())# 打印t1对象的self_id方法的返回值# 输出# <__main__.TestSelf object at 0x1055afbe0># <__main__.TestSelf object at 0x1055afbe0>print(t1ist1.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 就是对象自身

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容