cpj0036 发表于 2021-2-6 02:11:34

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

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
三者的区别

aleiluyes 发表于 2021-2-6 02:28:29

self = 当前对象的自身
self.name = 当前对象的自身里面的一个变量叫name
name =一个变量叫name

kogawananari 发表于 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异常

cpj0036 发表于 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

cpj0036 发表于 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

aleiluyes 发表于 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), 而是 被赋值 的变量 指向 数值 的 地址
一个 地址 可以被几百几千的变量所指向, 也就是那几百几千变量里面的数据都是 那个 一个 地址里面 的 数据

你视频教程里面的前面的基础没认真看

aleiluyes 发表于 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'
页: [1]
查看完整版本: self和name有什么区别 类与对象.面向对象编程 的视频里的问题