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)
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)