鱼C论坛

 找回密码
 立即注册
查看: 2114|回复: 9

[已解决]关于定义类的时候,“self.”的问题

[复制链接]
发表于 2017-3-8 18:04:47 | 显示全部楼层 |阅读模式

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

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

x
有两段代码

代码1:

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

代码2:

class Person:
        name = '小甲鱼'

为什么代码1中用self.name,而代码2中却用name没有self.?
最佳答案
2017-3-8 20:43:27
self代表的是类本身,用self.name则表示引用这个类本身的name属性,在SETNAME函数中,将name赋值给self.name,那么你的这个类的name属性就具有了外部接口,实例化过程中可以赋值,也可以引用。
下面的name=“小甲鱼”,这个属性没法在实例化过程中重新赋值了,只能引用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-8 18:05:17 | 显示全部楼层
来人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 18:11:24 | 显示全部楼层
因为(什么呢?这东西比较抽象)代码1是一个函数,函数被实例化时会被传入self参数,self指向自己类,所以要通过这个访问。Python不像C++那样的成员函数可以直接访问成员,如果你会C++的话就很好理解了(self=this)
代码2的name是在类的声明(定义)部分,是(定义了)一个成员,所以不用加self.。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-8 18:33:41 | 显示全部楼层
无符号整形 发表于 2017-3-8 18:11
因为(什么呢?这东西比较抽象)代码1是一个函数,函数被实例化时会被传入self参数,self指向自己类,所以 ...

也就是说,功能中的变量要加self.,而作为属性的变量则不用加self,是这样么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 20:43:27 | 显示全部楼层    本楼为最佳答案   
self代表的是类本身,用self.name则表示引用这个类本身的name属性,在SETNAME函数中,将name赋值给self.name,那么你的这个类的name属性就具有了外部接口,实例化过程中可以赋值,也可以引用。
下面的name=“小甲鱼”,这个属性没法在实例化过程中重新赋值了,只能引用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 21:12:43 | 显示全部楼层
代码1中的self.name是实例属性,代码2中的name是类属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-8 22:02:11 | 显示全部楼层
这一块确实很复杂 我自己也正在学习到这一块 之后还会有个东西叫cls 重写__new__里面会用到 我也理解不清楚 感觉好难 楼主一起加油吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 10:28:45 | 显示全部楼层
无符号整形 发表于 2017-3-8 18:11
因为(什么呢?这东西比较抽象)代码1是一个函数,函数被实例化时会被传入self参数,self指向自己类,所以 ...

你前面说得函数实例化不是很明白,应该是那个类被实例化了吧。然后你后面说得:python不能直接成员函数访问成员。我觉得应该是先是因为这个原因,才会在类中定义方法时传入self吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 10:33:14 | 显示全部楼层
hustlin 发表于 2017-3-8 20:43
self代表的是类本身,用self.name则表示引用这个类本身的name属性,在SETNAME函数中,将name赋值给self.nam ...

嗯,我觉得这个说得蛮有道理,定义方法的意义就在于可以外部来进行使用。还有我觉得用self的意义就是把类的实例化绑定上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 14:20:20 | 显示全部楼层
jackche0214 发表于 2017-3-9 10:33
嗯,我觉得这个说得蛮有道理,定义方法的意义就在于可以外部来进行使用。还有我觉得用self的意义就是把类 ...

Bingo,目的都是为了简便实用。怎么来简单规范又实用就怎么来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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