结合实例,详解类、类变量,实例、实例变量,作用域等内部运作关系,会对你有帮助!

class A:
      cls_i = 0
      cls_j = {}
      def __init__(self):
            self.instance_i = 0
            self.instance_j = {}
            self.H='qwer'#self.H叫实例变量H
      H=['a','b','c'] #叫类变量H
H=('e','789','yhn')#在类外面创建一个列表,列表名为H




a=A() #定义类A的一个实例a
print('a的作用域里有:')
print(a.__dict__) 
##  先看看a的作用域里有什么?dict是个字典,键是属性名,
##值是属性值;实例有自己的__dict__,它对应的类也有自己
##的__dict__。再看看A的作用域里有什么?
print('A的作用域里有:')
print(A.__dict__)
##我们看到,a的作用域中有instance_i和instance_j,A的作用
##域中有cls_i和cls_j。
##我们再来看看属性查找是如何发生的?在类实例中查找属性的
##时候,首先在实例自己的作用域中查找,如果没有找到,则再
##在类定义的作用域中查找。在给类实例属性赋值的时候,
##实际上会在类实例定义的作用域中添加一个属性(如果还不存
##在的话),并不会影响到相应类中定义的同名属性。


a.cls_i
##a在查找cls_i的时候,先在自己的作用域中找,若没有,则在类
##定义的作用域中查找。找到值为0.
print("注意下面2个代码显示内容:")
print(a.__dict__) 
a.instance_i
print(a.instance_i)
##在查找instance_i的时候,可以直接在a的作用域中找到它。找
##到的cls_i值为0。


a.cls_i =1
print("注意修改cls_i值后,下面2个代码显示内容:")
##以上企图通过实例a来修改cls_i的值为1,我们可以看到a的作用
##域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中
##的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属
##性,并没有修改到类属性。见下面2个代码
print(a.__dict__)
##{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
print(A.__dict__)
##{'__init__': , '__module__': '__main__', 'cls_i': 0,
##'cls_j': {}, '__doc__': None}
a.cls_j['a']='a'
##如果通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会
##怎么样呢?可以看到a的作用域没有发生什么变化,但是A的作用域
##中cls_j的数据发生了变化。
print("NOTE:通过a修改cls_j值为'a'后,下面2个代码显示内容:")
print(a.__dict__)
print(A.__dict__)


A.cls_k = 0
print("NOTE:类作用域发生了变化,下面2个代码显示内容:")
print('A的作用域里有:')
print(A.__dict__)
print('a的作用域里有:')
print(a.__dict__)
##实例的作用域发生变化,并不会影响到该类的其它实例,但是类
##的作用域发生变化,则会影响到该类的所有实例,包括在这之前
##创建的实例:
print(a.H)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值