caesar2334 发表于 2020-7-30 23:06:02

关于类中的 self

问题:我想问问下列两个代码,一个去掉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:09:14

__name 是类变量和实例变量,却不是函数体内的变量/参数,所以必须加 self 访问。

zltzlt 发表于 2020-7-30 23:09:26

因为你在方法内不加 self,Python 就会以为你要访问一个叫 __name 的局部变量,在 kick 方法中没找到有定义过 __name 局部变量,于是报错了

Twilight6 发表于 2020-7-30 23:14:21


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

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

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

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


caesar2334 发表于 2020-7-31 23:21:35

谢谢大家! 那实例空间和类空间有什么实质性的区别吗,百度了一下概念有点模糊,能不能劳烦具体讲解一下呢?请指教!

Twilight6 发表于 2020-8-1 09:18:59

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


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

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

对于实例化 a、b 两个对象,a、b 两个都可以找到类中的属性,而你 a 实例对象的就找不到 b 实例对象的 实例属性

caesar2334 发表于 2020-8-1 09:47:41

Twilight6 发表于 2020-8-1 09:18
类空间是所有该类实例对象都共用的,而实例空间是只有自己实例用的

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

好的 明白了!谢谢你!
页: [1]
查看完整版本: 关于类中的 self