鱼C论坛

 找回密码
 立即注册
查看: 723|回复: 7

[已解决]类中方法访问问题?

[复制链接]
发表于 2021-9-6 20:53:51 | 显示全部楼层 |阅读模式

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

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

x
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,该死的,谁踢我...
我叫土豆,该死的,谁踢我...
最佳答案
2021-9-6 21:32:52
zyj1214 发表于 2021-9-6 21:21
我是不是可以这样理解self有点类似class中的全局变量的合集,
只要类中任何函数的变量前面加(self. +变 ...

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

这样应该明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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为调用它的那个实体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 次做:定義類 + 參數賦值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我是不是可以这样理解self有点类似class中的全局变量的合集,
只要类中任何函数的变量前面加(self. +变量名)=变量名(这里必须把变量名赋值给 self. +变量名),其他函数就可以访问这个变量。。
注明:但是这个变量前面必须加self. 才行,而且每个函数的第一个参数必须是self才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-6 21:32:52 | 显示全部楼层    本楼为最佳答案   
zyj1214 发表于 2021-9-6 21:21
我是不是可以这样理解self有点类似class中的全局变量的合集,
只要类中任何函数的变量前面加(self. +变 ...

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

这样应该明白了
1630935037(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-6 21:59:26 | 显示全部楼层

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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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