class A(object):
cls_name = 'fenghua'
def __init__(self):
# self.cls_name = 'fenghua1'
self.age = 12
def func1(self):
self.num = '123'
@classmethod
def b(cls):
cls.age1 = 2
return cls.age1
@staticmethod
def c():
print('6666')
a = A()
b = A()
print(a.cls_name)
# 实例属性名与类属性名重复,优先调用实例属性的内容'fenghua1'(例如再init中写self.cls_name = 'fenghua1')
print(id(a.cls_name))
print(id(b.cls_name))
# a,b都引用实例属性的cls_name的内容
print(id(A.cls_name)) # A引用类属性的cls_name内容
a.cls_name = 'bobo'
print(id(a.cls_name))
# 地址改变,因为实例对象改变类属性,之后从实例属性找,没有,就找类属性并实例化出一个新的实例属性
print(id(b.cls_name))
print(id(A.cls_name))
# 地址不变,因为实例对象玩无法修改类属性
# print(A.age)
# 报错!类对象不能访问实例属性
a.age = 13
print(a.age)
print(b.age)
# 实例对象只能修改对象本身的实例属性,不影响其他对象的实例属性
print(a.age1) # 实例对象不能访问类方法中的类属性
A.cls_name = 'datou'
print(a.cls_name)
# 上边通过类对象改变类属性,实例对象的值不受影响,因为a.cls_name已经改过,原来的‘fenghua’已经修改并创建了新的实例属性,不是对原来类属性的引用
print(b.cls_name)
# 没有改过,仍然是对原来类属性的引用
结果:
fenghua
2665071022968
2665071022968
2665071022968
2665071024816
2665071022968
2665071022968
13
12
bobo
datou
!!!实例对象一旦修改实例属性或类属性都会创建新的实例属性,不再是对原属性的引用。所以其他对象都不会受实例对象改变属性的影响。
!!! 类方法可以在类外修改类属性
!!! 类方法中(即不在类方法外的类属性)的类属性不能被实例对象和类对象调用和修改
@classmethod
def b(cls):
cls.age1 = 2
return cls.age1
print(A.age1)
print(a.age1)
报错: AttributeError: type object 'A' has no attribute 'age1'