鱼C论坛

 找回密码
 立即注册
查看: 1569|回复: 6

[已解决]self和name有什么区别 类与对象.面向对象编程 的视频里的问题

[复制链接]
发表于 2021-2-6 02:11:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Ball:
    def setName(self,name):
        self.name = name
        print('我叫%s不要踢我'%self.name)

        print(id(name))
        print(id(self))
        
    def kick(self,name):
        self.name = name
        print('我叫%s不要踢我'%self.name)

        print(id(name))
        print(id(self))
        
a = Ball()
a.setName('ball A')

a.kick('ball B')

这个程序的运行结果是:
----------------------------
我叫ball A不要踢我
2226891686384
2226891111672
我叫ball B不要踢我
2226891686440
2226891111672
------------------------------

里边一共四个id数字,注意看第二个和第四个,他们是相同的,我把self理解成了函数里的局部变量,但是局部变量的话,id不会相同(正如第一个id和第三个id)
为什么他们的id会相同呢?
求问:
self.name
self
name
三者的区别
最佳答案
2021-2-6 02:28:41
def kick(self,name) self和name分别是两个参数

a.kick('ball B') 实际上是 Ball.kick(a, 'ball B')  你在函数里分别输出两个参数的id  

第二个和第四个都是id(self) 也就是id(a)  你可以print(id(a))试试是一样的

self即是a。 self.name自然也就是a.name
按照查找顺序: Ball.__getattribute__(a,'name'),Ball的数据描述符, a.__dict__['name'], Ball的非数据描述符 ,Ball.__dict__['name'],Ball.__getattr__(a,'name')
都找不到会抛出AttributeError异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 02:28:29 | 显示全部楼层
self = 当前对象的自身
self.name = 当前对象的自身里面的一个变量叫name
name =  一个变量叫name
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 02:28:41 | 显示全部楼层    本楼为最佳答案   
def kick(self,name) self和name分别是两个参数

a.kick('ball B') 实际上是 Ball.kick(a, 'ball B')  你在函数里分别输出两个参数的id  

第二个和第四个都是id(self) 也就是id(a)  你可以print(id(a))试试是一样的

self即是a。 self.name自然也就是a.name
按照查找顺序: Ball.__getattribute__(a,'name'),Ball的数据描述符, a.__dict__['name'], Ball的非数据描述符 ,Ball.__dict__['name'],Ball.__getattr__(a,'name')
都找不到会抛出AttributeError异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 02:58:13 | 显示全部楼层
kogawananari 发表于 2021-2-6 02:28
def kick(self,name) self和name分别是两个参数

a.kick('ball B') 实际上是 Ball.kick(a, 'ball B')  你 ...

您刚才答:self即是a。 self.name自然也就是a.name
但是实际上他们并不相等,我刚才实验了a.name只等于kick函数中的self.name
--------------------------程序--------------------------------
class Ball:
    def setName(self,name):
        self.name = name
        print('我叫%s不要踢我'%self.name)

        print(id(name))
        print(id(self))
        print(id(self.name)) ####
        
    def kick(self,name):
        self.name = name
        print('我叫%s不要踢我'%self.name)

        print(id(name))
        print(id(self))
        print(id(self.name)) ####
        
a = Ball()
a.setName('ball A')

a.kick('ball B')
print(id(a.name))
---------------------end----------------------------------------------
---------------运行结果---------------
我叫ball A不要踢我
1954812625504
1954812050792
1954812625504
我叫ball B不要踢我
1954812625560
1954812050792
1954812625560
1954812625560
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 03:04:17 | 显示全部楼层
kogawananari 发表于 2021-2-6 02:28
def kick(self,name) self和name分别是两个参数

a.kick('ball B') 实际上是 Ball.kick(a, 'ball B')  你 ...

内部原理我也不太清楚,但是貌似不能说self.name 和a.name全等   可以从我的程序看到开始是setName里的self指向了对象a,但是后来setName把对象抛弃了,换成kick方法里的self指向对象a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 03:12:57 | 显示全部楼层
本帖最后由 aleiluyes 于 2021-2-6 03:21 编辑
cpj0036 发表于 2021-2-6 02:58
您刚才答:self即是a。 self.name自然也就是a.name
但是实际上他们并不相等,我刚才实验了a.name只等于k ...


你这得要有点c语言基础才行, 这里参数是 地址 传递(指针), 而不是 地址里面 的 数据 传递
a.setName('ball A') 传进去的是 'ball A', 一个地址, 地址里面 有 'ball A' 内容
a.kick('ball B') 传进去的是 'ball B', 一个地址, 地址里面 有 'ball B' 内容

当class(类)被定义的时候就会分配一个地址, 然后后面数值的地址都会紧挨着那个地址
当多个被定义的时候, 怎么找到自己所在? 那就得靠self, 注释一下 self == 自身

python 里面的赋值不是 数值 传递过去的(不 copy), 而是 被赋值 的变量 指向 数值 的 地址
一个 地址 可以被几百几千的变量所指向, 也就是那几百几千变量里面的数据都是 那个 一个 地址里面 的 数据

你视频教程里面的前面的基础没认真看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 03:25:09 | 显示全部楼层
本帖最后由 aleiluyes 于 2021-2-6 03:31 编辑
cpj0036 发表于 2021-2-6 03:04
内部原理我也不太清楚,但是貌似不能说self.name 和a.name全等   可以从我的程序看到开始是setName里的se ...


你那个是
当 a.kick('ball B') 的时候  里面的
    def kick(self,name):
        self.name = name

def setName(self,name):
     self.name = name

self.name 给覆盖了
self.name 不再指向 'ball A', 而是 指向 'ball B'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表