在前面的例子中我们接触到的就是实例属性(对象属性),顾名思义,类属性就是类对象
所拥有的属性,它被所有类对象
的实例对象
所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象
和实例对象
访问
类属性(访问、修改、添加、删除)
class People(object):
name = 'Tom' #公有的类属性
__age = 12 #私有的类属性
p = People()
###1 访问
print(p.name) #正确
print(People.name) #正确
#print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
#print(People.__age) #错误,不能在类外通过类对象访问私有的类属性
###2 添加(类对象和实例对象)
People.weigt = 140
print(People.weigt)
p.address = "上海"
print(p.address)
#3 直接修改类属性
People.name = "Jay"
print(p.name) #正确
print(People.name) #正确
##4 删除类属性
del People.weigt
#print(People.weigt) ##已经删除
Tom
Tom
140
上海
Jay
Jay
注意:
- 不能在类外通过实例对象访问私有的类属性,也不能通过类对象访问私有的类属性。
- 可直接对类属性和实例属性进行修改、增加、删除,实际应用中要注意影响。
实例属性(对象属性)
class People(object):
address = '山东' #类属性
def __init__(self):
self.name = 'xiaowang' #实例属性
self.age = 20 #实例属性
self.__phone= 1388888888 #私有属性
p = People()
#1 修改实例属性
p.age =12 #修改实例属性
## 2 访问实例属性
print(p.address) #正确
print(p.name) #正确
print(p.age) #正确
#print(p.__phone) #错误,不能在类外通过实例对象访问私有属性
print(People.address) #正确
#print(People.name) #错误,不能在类外通过类对象访问实例属性
#print(People.age) #错误,不能在类外通过类对象访问实例属性
#3 添加属性
People.time = 2000
p.phone = 13888888
print(p.phone)
print(People.time)
print(p.time)
#4 删除
#del p.time #这个时候无法删除
del People.time
山东
xiaowang
12
山东
13888888
2000
2000
注意:
- 不能在类外通过实例对象访问私有的实例属性;
- 不能在类外通过类对象访问实例属性;
- 可直接对类属性和实例属性进行修改、增加、删除,实际应用中要注意影响。
通过实例(对象)去修改类属性
class People(object):
country = "china"
#打印类属性
print(People.country)
#创建实例对象
p=People()
t=People()
#打印实例对象属性
print(p.country)
#修改实例对象属性
p.country = "Amarica"
print(p.country)
print(People.country)
#删除实例属性
del p.country
print(p.country)
print(People.country)
#测试修改类属性
print(t.country)
People.country = "rusa"
#类属性修改后影响了实例属性
print(t.country)
china
china
Amarica
china
china
china
china
rusa
总结
- 如果需要在类外修改
类属性
,必须通过类对象
去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性
,这种方式修改的是实例属性
,不会影响到类属性
,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性
,除非删除了该实例属性
。
实例属性(实例对象拥有的属性) |
类属性 |
只有实例自己可以使用 |
可以通过类和实例来访问 |
实例对象不可以直接修改类属性,只是在实例对象中创建了一个与类属性同名的实例属性,如需修改需要调用类方法来修改。 |
可以直接通过类修改类属性(C.value +=1) |
公有的类属性修改后,实例对象里面公用的类属性也会被修改。 |