Python学习26:类属性vs实例属性

类属性访问(只能通过"类.属性"的方式修改类的属性)

类属性可以通过类或者实例来访问。

#FileName : classAvr.py

#定义一个普通类,测试类属性
class C(object):
    fooc = 100
    
#构建一个实例
c = C()
print('类属性:C.fooc = ',C.fooc)           #foo = 100
print('通过对象实例测试属性c.fooc = ',c.fooc)   #foo = 100
print(id(C.fooc),' ',id(c.fooc))

#通过实例修改属性(会创建一个实例属性fooc,因为任何对实例属性的赋值都会创建一个实例属性(如果不存在),这个实例属性会屏蔽对类属性的访问)
c.fooc = 2000
#再次打印类属性
print('类属性:C.fooc = ',C.fooc)           #foo = 100
print('通过对象实例测试属性c.fooc = ',c.fooc)   #foo = 2000
print(id(C.fooc),' ',id(c.fooc))

del c.fooc
print('类属性:C.fooc = ',C.fooc)           #foo = 100
print('通过对象实例测试属性c.fooc = ',c.fooc)   #foo = 100


我们只有使用引用fooc的时候,才能更新它的值,如C.fooc.

通过实例c.fooc更新类类属性(不可以),实例会创建一个实例属性fooc。这个实例属性会屏蔽类属性。只有实例属性被清除之后,才能通过实例查看类属性

 

类属性可变的情况(类属性为:字典、列表、集合的情况)可以通过实例修改类型属性

#定义另一个普通类,测试类属性
class B(object):
    ls = ['Hello','Python','World']
    
#构建对象实例
b = B()
#打印属性
print('B.ls = ',B.ls)                    #['Hello', 'Python', 'World']
print('b.ls = ',b.ls)                    #['Hello', 'Python', 'World']

#通过对象实例删除ls中的一项
b.ls.pop(1)
print('B.ls = ',B.ls)                    #['Hello', 'World']
print('b.ls = ',b.ls)                    #['Hello', 'World']

#定义一个类用于测试类属性为集合的情况
class A(object):
    s = set('Hello')
#构建实例
a = A()
print(a.s)
#通过实例更新类属性
a.s.add('aaa')
print(A.s)


python中的类属性只是存储与类相关的数据,和该类的实例无关。类属性和java中的静态成员变量类似。访问python的类属性可使用类名+“.”+属性名的方式,

如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值