关于类和对象的问题
class A():lst1=
lst2=
def __init__(self):
self.lst1=10
self.lst2=10
a=A()
print(A.lst1)
print(a.lst1)
print(A.lst2)
print(a.lst2)
print(A.lst1) # 打印结果
print(a.lst1) # 打印结果 10
print(A.lst2) # 打印结果
print(a.lst2) # 打印结果
为什么 A.lst1和a.lst1打印结果不一样,但 A.lst2 和a.lst2 结果又一样呢 self.lst1 = 10进行绑定了类的实例属性,也就是替换了原来的lst1,而self.lst2没有被替换,只是做了修改,把3换成了10,也就是self.lst2 = 10的作用,结果当然不一样啦,一个被替换,一个被修改! 类实例化后会有个特殊效果。
在本身属性没有的情况下会去类中查找。
第一次打印A.lst1的时候,因为没有实例化,所以A默认调用的是自己功能内的lst1;
第二次打印a.lst1的时候,实例化,lst1和lst2都有了值,覆盖了上面类实例化中的lst1和lst2,也覆盖了类中的lst1和lst2.
第三次打印A.lst2的时候,原理见上面一条。
第四次打印a.lst2的时候,原理见上上面一条。
通过此例可以看出,类实例化中,列表是全局的,不管你怎么实例化,修改的都是类中原来的属性。
实际应用中可以用于实现网页登录特征。 本帖最后由 sunrise085 于 2020-9-15 19:37 编辑
heidern0612 发表于 2020-9-15 15:27
类实例化后会有个特殊效果。
在本身属性没有的情况下会去类中查找。
2楼说的才有点道理,但不是被替换,一个是被覆盖屏蔽了,一个是被修改了
在__init__中,self.lst1=10,是直接定义实例属性lst1,并对其进行赋值这就屏蔽了类属性lst1,当用实例对象懂lst1的时候调用的就是实例属性lst1,而非类属性lst1
在__init__中,self.lst2=10,相当于直接修改实例属性lst2,要修改,那就需要先找找是否定义了,若没有定义,则会报错,会先找实例属性lst2,发现没找到,然后再向上一层找类属性lst2,找到了!然后就对其进行了修改。这相当于实际上没有实例属性lst2,一直使用的都是类实例属性lst2
所以才会出现如此运行结果。
通过此例可以看出,类实例化中,列表是全局的,不管你怎么实例化,修改的都是类中原来的属性。
你这句话是不对的,你可以看看下面的运行结果
class A():
lst1=
lst2=
def __init__(self):
self.lst1=10
self.lst2=
a=A() #在这里的时候,类属性lst2就已经被修改了。而不是想你说的,到第二次打印a.lst1的时候才覆盖。
print(A.lst1)
print(a.lst1)
print(A.lst2)
print(a.lst2)
对于可变对象和不可变对象修改和定义的一些区别,尤其是在函数中修改,可以看看我写的这个帖子的第四部分。或许能理解的更好一些
sunrise085 发表于 2020-9-15 19:33
2楼说的才有点道理,但不是被替换,一个是被覆盖屏蔽了,一个是被修改了
在__init__中,self.lst1=10 ...
不管有没有,替换还是屏蔽啥的。
在实例化属性没有的情况下,才会去类中找,有的话就是自己私有的,跟类属性不混淆。 {:10_256:}{:10_256:} 看不懂来围观下哈 。
页:
[1]