python 类属性 实例属性 特性

实例属性遮盖类的数据属性

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


你可能感兴趣的:(python)