类属性访问(只能通过"类.属性"的方式修改类的属性)
类属性可以通过类或者实例来访问。
#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的类属性可使用类名+“.”+属性名的方式,
如果类的实例没有同名变量也可以使用实例来访问。如果实例含有与类属性同名的属性,则用该实例访问属性时,访问的是实例中的属性。