Python 中类变量和实例变量的引用

参考博客:https://blog.csdn.net/m0_37843198/article/details/78896509 感谢博主的分享

类变量 在创建多个实例的时候,类变量是共享的!!!!!!

类变量是List列表类型时也一样四共享的,我们直接看代码:

class Dog:
  
    n = 4 # 类变量
    n_list = []
            # 如果类变量和实例变量同名的话 会优先调用实例变量
    def __init__(self,name): #构造函数
        self.name = name # 实例变量
    '''
    对于这些参数,实例中的是在类中的,实例中只有父类的构造函数,其余的成员函数是在类中给的
    '''
    def bulk(self): #成员函数
        print('%s: wang wang!!!'%self.name)

d1 = Dog("BeiBei") # 实例化 初始化一个类 造了一个对象----把一个类变为一个具体对象的过程叫做实例化
d2 = Dog("xiaohei")

d1.n = 8  # 这种情况 是将类变量创建了实例属性 所以
d1.n_list.append("From Dog1")
print("dog2======%s----dog2 n_list =====%s"%(d2.n,d2.n_list))
d2.n = 23
d2.n_list.append("From Dog2")# 这种是直接对n_list进行添加操作,没有创建实例属性 实际修改的是类Dog中的类变量
print("dog1 n ===%s----dog1 n_list ====%s"%(d1.n,d1.n_list))
print("dog2======%s----dog2 n_list =====%s"%(d2.n,d2.n_list))
print("Dog ======%s-----Dog n_list =====%s"%(Dog.n,Dog.n_list))
d1.bulk()

print("--------------------------------------------------------")
d1.n_list = ["from Dog1 hahahah"] #这种就是创建了类变量的实例属性,只会更改d1的n_list 不会更改d2 和 Dog的n_list
print("d1 n_list==========%s d2 n_list =====%s"%(d1.n_list,d2.n_list))

输出结果:

dog2======4----dog2 n_list =====['From Dog1']
dog1 n ===8----dog1 n_list ====['From Dog1', 'From Dog2']
dog2======23----dog2 n_list =====['From Dog1', 'From Dog2']
Dog ======4-----Dog n_list =====['From Dog1', 'From Dog2']
BeiBei: wang wang!!!
--------------------------------------------------------

d1 n_list==========['from Dog1 hahahah'] d2 n_list =====['From Dog1', 'From Dog2']

在例程中:

 d1.n = 8 是将类变量创建了实例属性,所以更改后Dog类和实例 d2中的n值不会改变

对于List类变量,很多同学蒙圈了:

我们看一下List的操作是d1.n_list.append("From Dog1") 这是直接对List进行操作,并没有对类变量创建实例属性。

d1.n_list.append("From Dog1") 首先在实例d1中的实例变量中搜索n_list,发现没有,接着到类Dog中去搜索,哎!!!我擦,这不有么,所以就把类Dog中的n_list 给改掉了。两个实例d1 和 d2 都是引用的类中的n_list 所以打印时 d1 d2 Dog中的n_list都改了

例程的最后:

d1.n_list = ("from dog1 hahahah") 这种调用方式就是创建类变量的实例引用,所以只会更改实例d1中的n_list的值

不会更改 Dog d2的n_list的值


猜你喜欢

转载自blog.csdn.net/kokodudu/article/details/80699039