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

您所在的位置:网站首页 类变量python Python 中类变量和实例变量的引用

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

2023-10-12 16:06| 来源: 网络整理| 查看: 265

参考博客: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的值



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3