鱼C论坛

 找回密码
 立即注册
查看: 1175|回复: 8

[已解决]关于类中的 self

[复制链接]
发表于 2020-7-30 23:06:02 | 显示全部楼层 |阅读模式

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

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

x
问题:我想问问下列两个代码,一个去掉self 一个加上为什么会有两个不一样的结果呢,在函数方法当中直接引用一个外围的变量感觉没有问题诶,是不是和这个变量__name 是私有变量有关呢?请指教!


后上代码:
class Person:
        __name = "小甲鱼"
        def kick(self):
                print("我是%s" % self.__name)

                
>>> a = Person()
>>> a.kick()
我是小甲鱼


这样是正确的。但是下面这个:

class Person:
        __name = "小甲鱼"
        def kick(self):
                print("我是%s" % __name)

                
>>> a = Person()
>>> a.kick()
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    a.kick()
  File "<pyshell#29>", line 4, in kick
    print("我是%s" % __name)
NameError: name '_Person__name' is not defined
最佳答案
2020-7-30 23:14:21

首先 __name 是在类内,类方法外的空间,那么这个__name 变量就属于类变量

而当你想使用这个类变量时候,就需要带上类名,而你直接 self.__name 是因为你创建了实例,而实例空间找不到 __name 变量,就要去类对象找,类对象找到了 __name 变量所以成功返回

而你直接 __name 会导致在实例对象中找不到 __name 属性,所以导致报错

区别就在于你是否带类名和不带类名了,你带 self 本质上还是查找到之前类对象的 __name 属性,因为 __name 是类属性


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 23:09:14 | 显示全部楼层
__name 是类变量和实例变量,却不是函数体内的变量/参数,所以必须加 self 访问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 23:09:26 | 显示全部楼层
因为你在方法内不加 self,Python 就会以为你要访问一个叫 __name 的局部变量,在 kick 方法中没找到有定义过 __name 局部变量,于是报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 23:14:21 | 显示全部楼层    本楼为最佳答案   

首先 __name 是在类内,类方法外的空间,那么这个__name 变量就属于类变量

而当你想使用这个类变量时候,就需要带上类名,而你直接 self.__name 是因为你创建了实例,而实例空间找不到 __name 变量,就要去类对象找,类对象找到了 __name 变量所以成功返回

而你直接 __name 会导致在实例对象中找不到 __name 属性,所以导致报错

区别就在于你是否带类名和不带类名了,你带 self 本质上还是查找到之前类对象的 __name 属性,因为 __name 是类属性


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 23:21:35 | 显示全部楼层
谢谢大家! 那实例空间和类空间有什么实质性的区别吗,百度了一下概念有点模糊,能不能劳烦具体讲解一下呢?请指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 09:18:59 | 显示全部楼层
caesar2334 发表于 2020-7-31 23:21
谢谢大家! 那实例空间和类空间有什么实质性的区别吗,百度了一下概念有点模糊,能不能劳烦具体讲解一下呢 ...


类空间是所有该类实例对象都共用的,而实例空间是只有自己实例用的

比如你定义了一个 A 类,将他实例化对象:a = A() 、b = A() 两个对象

对于实例化 a、b 两个对象,a、b 两个都可以找到类中的属性,而你 a 实例对象的就找不到 b 实例对象的 实例属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 09:47:41 | 显示全部楼层
Twilight6 发表于 2020-8-1 09:18
类空间是所有该类实例对象都共用的,而实例空间是只有自己实例用的

比如你定义了一个 A 类,将他实 ...

好的 明白了!谢谢你!

点评

客气了~  发表于 2020-8-1 09:49
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 16:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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