概述
python是 动态语言,可以 动态 添加、删除 对象的 实例属性,有时在获取某对象的属性时,应先判断是否存在该属性
准备
创建类
class Phone:
pass
添加属性-方式一
iphone=Phone("iphoneX")
动态设置属性, 对象名.属性名 = 属性值
iphone16.cpu = 'A16'
iphone16.ram = 8
iphone16.screen = 6.1
iphone16.active = False
访问属性:
print("顾客问:这是什么cpu?")
# 访问属性,对象名.属性名
print("店员答:",iphone16.cpu)
print("顾客问:内存是多大?")
print("店员答:",iphone16.ram)
print("顾客问:是二手手机吗?")
print("店员答:",iphone16.active)
修改属性:
print("顾客说:你帮我激活手机")
# 修改属性,与设置属性相同
iphone16.active = True
print("店员答:",iphone16.active)
问题
如何证明cpu属性只是存在iphone实例中,不存在huawei实例中?
查看对象拥有的属性
通过内置属性 __dict__查看对象所有的属性,返回的是dict类型。
详见:http://www.malaoshi.top/show_1EF2CdO4Y648.html
print(iphone.__dict__)
print(huawei.__dict__)
结果
{'name': '华为P20'}
{'name': 'iphoneX', 'cpu': 'A11'}
从结果可知,通过动态添加的属性,只是在iphone实例才有,huawei实例是没有的
不推荐动态添加对象的属性
动态添加对象的属性,会导致同一个类创建的对象,属性不一致,如:属性 cpu 仅 iphone 这个实例才有,别的对象没有该 cpu 属性。
所以这种方式不推荐
添加属性-方式二
#函数
setattr(obj,name,value)
设置一个属性。如果属性存在,就修改属性值,如果属性不存在,会创建新属性,代码如下:
setattr(iphone,"screen_size",6)
print(iphone.screen_size)
print(iphone.__dict__)
访问对象的属性
#函数
getattr(obj, name[, default])
- 如果不设置默认值,在访问不存在的属性时,会报错
AttributeError: 'Phone' object has no attribute 'rom' - 如果设置默认值,在访问不存在的属性时,会返回默认值,但该实例并没有该属性
代码如下:
#访问存在的属性
print(getattr(iphone,"name"))
#访问不存在的属性,会报错
print(getattr(iphone,"rom"))
#设置默认值,访问不存在的属性时,会返回默认值,但不会添加该属性
print(getattr(iphone,"rom","64G"))
#查看iphoen的属性,没有rom属性
print(iphone.__dict__)
判断属性是否存在
#返回布尔值,存在返回True,不存在返回False
hasattr(obj,name)
代码如下:
#属性不存在时返回False
print(hasattr(iphone,"rom"))
#属性存在时返回True
print(hasattr(iphone,"name"))
删除属性
#无返回值
delattr(obj, name)
注意:
属性名必须是字符串
代码如下:
#删除实例iphone的name属性
delattr(iphone,'name')
print(iphone.__dict__)
感谢文章:
http://www.cnblogs.com/cenyu/p/5713686.html
https://www.cnblogs.com/zh1164/p/6031464.html