关于类中的 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 __name 是类变量和实例变量,却不是函数体内的变量/参数,所以必须加 self 访问。 因为你在方法内不加 self,Python 就会以为你要访问一个叫 __name 的局部变量,在 kick 方法中没找到有定义过 __name 局部变量,于是报错了
首先 __name 是在类内,类方法外的空间,那么这个__name 变量就属于类变量
而当你想使用这个类变量时候,就需要带上类名,而你直接 self.__name 是因为你创建了实例,而实例空间找不到 __name 变量,就要去类对象找,类对象找到了 __name 变量所以成功返回
而你直接 __name 会导致在实例对象中找不到 __name 属性,所以导致报错
区别就在于你是否带类名和不带类名了,你带 self 本质上还是查找到之前类对象的 __name 属性,因为 __name 是类属性
谢谢大家! 那实例空间和类空间有什么实质性的区别吗,百度了一下概念有点模糊,能不能劳烦具体讲解一下呢?请指教! caesar2334 发表于 2020-7-31 23:21
谢谢大家! 那实例空间和类空间有什么实质性的区别吗,百度了一下概念有点模糊,能不能劳烦具体讲解一下呢 ...
类空间是所有该类实例对象都共用的,而实例空间是只有自己实例用的
比如你定义了一个 A 类,将他实例化对象:a = A() 、b = A() 两个对象
对于实例化 a、b 两个对象,a、b 两个都可以找到类中的属性,而你 a 实例对象的就找不到 b 实例对象的 实例属性 Twilight6 发表于 2020-8-1 09:18
类空间是所有该类实例对象都共用的,而实例空间是只有自己实例用的
比如你定义了一个 A 类,将他实 ...
好的 明白了!谢谢你!
页:
[1]