python面向对象2

 

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'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值