zyj1214 发表于 2021-9-6 20:53:51

类中方法访问问题?

class Ball:
    def setName(self, name):
      self.name = name
    def kick(self):
        print("我叫%s,该死的,谁踢我..." % self.name)

a = Ball()
a.setName('球A') #这里不明白把 ‘球A'传递给函数def setName(self, name)中的name,为什么
                        #def kick(self)函数可以调用def setName(self, name)函数中的name变量(self.name)?
                        #不是跨函数不可以访问的吗?不理解?
b = Ball()
b.setName('球B')
c = Ball()
c.setName('土豆')

a.kick()
b.kick()
c.kick()
结果:
我叫球A,该死的,谁踢我...
我叫球B,该死的,谁踢我...
我叫土豆,该死的,谁踢我...

suchocolate 发表于 2021-9-6 21:01:32

本帖最后由 suchocolate 于 2021-9-6 21:03 编辑

class Ball:
    def setName(self, name):
      self.name = name# 实例变量,本实例函数间共享,正常实例变量定义要放到__init__里。
      s = "test"# 函数私有变量,只在本函数内有效。

    def kick(self):
      print("我叫%s,该死的,谁踢我..." % self.name)# 不会报错
      print("我叫%s,该死的,谁踢我..." % s)# 会报错


b = Ball()
b.setName('球a')
b.kick()

Max472 发表于 2021-9-6 21:03:23

self 是属于class Ball 这个类的,在这个类里的每个函数是通用的
a = Ball()
这只是创建了一个 Ball 类的名字叫 a 实体,就像只是申请了一块和 Ball 类一样大的内存空间并把它取名叫 a,里面没有内容,
a.setName('球A')
a 这个实体调用类的 setName() 方法对 a 的 name 变量进行复制,因为是实体 a 调用的,所以 setName(self, name) 中的 self可以不写,默认self为调用它的那个实体

傻眼貓咪 发表于 2021-9-6 21:08:17

本帖最后由 傻眼貓咪 于 2021-9-6 21:09 编辑

你的代碼和下面代碼同意思,只是你把輸入參數方法拆開來了
class Ball:
    def __init__(self, name = None):
      self.name = name # 初始化參數

    def kick(self):
      print("我叫%s,该死的,谁踢我..." % self.name)

a = Ball('球A') # 當你定義類同時輸入參數 '球A'
b = Ball('球B')
c = Ball('土豆')

a.kick()
b.kick()
c.kick()

你的代碼分 2 次做:定義類 + 參數賦值

zyj1214 发表于 2021-9-6 21:21:17

Max472 发表于 2021-9-6 21:03
self 是属于class Ball 这个类的,在这个类里的每个函数是通用的
a = Ball()
这只是创建了一个 Ball 类的 ...

我是不是可以这样理解self有点类似class中的全局变量的合集,
只要类中任何函数的变量前面加(self. +变量名)=变量名(这里必须把变量名赋值给 self. +变量名),其他函数就可以访问这个变量。。
注明:但是这个变量前面必须加self. 才行,而且每个函数的第一个参数必须是self才行

Max472 发表于 2021-9-6 21:32:52

zyj1214 发表于 2021-9-6 21:21
我是不是可以这样理解self有点类似class中的全局变量的合集,
只要类中任何函数的变量前面加(self. +变 ...

self 代表的是一个类的实体
你也可以不用实体调用类的方法,直接用类去调用,就是这样
a = Ball()
Ball.setName(a, '球A')        //        这是类调用类内方法,要把方法的参数写全,如果用类的实体调用就可以不用写 self 参数,默认为调用它的那个实体

这样应该明白了

zyj1214 发表于 2021-9-6 21:59:26

suchocolate 发表于 2021-9-6 21:01


class Ball:
    def setName(self, name):
      self.name = name# 实例变量,本实例函数间共享,正常实例变量定义要放到__init__里。
      s = "test"# 函数私有变量,只在本函数内有效。

    def kick(self):
      print("我叫%s,该死的,谁踢我..." % self.name)# 不会报错
                                                                               # 这里为什么% self.name可以调用
                                                                               #def setName(self, name)中的
                                                                              #self.name = name# 的实例变量
      print("我叫%s,该死的,谁踢我..." % s)# 会报错


b = Ball()
b.setName('球a')
b.kick()

suchocolate 发表于 2021-9-7 09:56:37

zyj1214 发表于 2021-9-6 21:59
class Ball:
    def setName(self, name):
      self.name = name# 实例变量,本实例函数间共享 ...

先学习对象基础吧:https://www.runoob.com/python3/python3-class.html
页: [1]
查看完整版本: 类中方法访问问题?