实例属性遮盖类的数据属性
class Student: # 学生类
height = "student height" # 定义身高属性
>>> xiaoming = Student() # 实例化小明
>>> vars(xiaoming) # vars函数小明obj的__dict__属性,表明没有实例属性
{}
>>> xiaoming.height # 读取xiaoming.height 获取的是Student的值
'student height'
>>> xiaoming.height = 180 # 为xiaoming.height创建一个实例属性
>>> vars(xiaoming) # 发现有实例属性
{'height': 180}
>>> xiaoming.height # 实例属性遮盖类属性
180
>>> Student.height # 类属性完整
'student height'
class Student:
height = "student height"
@property
def character(self): # 定义性格特性
return "youth,study"
>>> xiaoming = Student()
>>> Student.character # 直接读取类character特性,获取的是特性值方法
>>> xiaoming.character # 执行特性读值方法
'youth,study'
>>> xiaoming.character = 'rich' # 为特性没有setter方法写值失败
Traceback (most recent call last):
File "", line 1, in
AttributeError: can't set attribute
>>> xiaoming.__dict__['character'] = 'rich' # 把character直接存入小明的__dict__中
>>> vars(xiaoming) # 发现有实例属性了
{'character': 'rich'}
>>> xiaoming.character # 读取的仍然是实例特性
'youth,study'
>>> Student.character = 'pool' # 覆盖Student.character特性,特性对象被销毁
>>> xiaoming.character # Student.character已经变成属性了,读取xiaoming.character不在被特性覆盖
'rich'
class Student:
height = "student height"
@property
def character(self):
return "youth,study"
>>> xiaoming = Student()
>>> xiaoming.height = 180
>>> xiaoming.height # 获取的是实例属性height
180
>>> Student.height # 获取的是类属性height
'student height'
>>> Student.height = property(lambda self: "19999") # 新特性覆盖类属性
>>> xiaoming.height # 实例属性被类特性遮盖
'19999'
>>> del Student.height # 删除特性
>>> xiaoming.height # 获取的是实例属性height
180