第二十八章、类和对象(高级)
1. 对象属性管理的内置函数
示例:
class Dog:
pass
dog1 = Dog()
dog1.color = "黑色"
问题:
一个小狗类型的对象 dog1 它是否有 kind 这个属性呢?
上述程序为dog1绑定的对象创建了color 属性,但是在运行程序后,无法动态的去检测 是否有 kind 属性。
如果需要动态检测、添加、删除和修改属性,可以使用对象属性管理的内置函数。
对象属性管理的内置函数如下表所示
函数
说明
getattr(obj, name[, default])
从一个对象得到对象的属性;getattr(obj, 'y') 等同于x.y; 当属性不存在时,如果给出default参数,则返回default,如果没有给出default 则产生一个AttributeError错误。
setattr(obj, name, value)
与getattr函数相对应,给对象obj的名为name的属性设置相应的值value, setattr(obj, 'y', v) 等同于 obj.y = v。
hasattr(obj, name)
实参是一个对象和一个字符串name。如果对象存在属性 name,则返回 True,否则返回 False。,此种做法可以避免在getattr(obj, name)时引发错误。
delattr(obj, name)
这是 setattr() 的相关函数。 实参是一个对象和一个字符串name。 其中字符串name必须是对象的某个属性的名称。 该函数会删除指定的属性。 例如, delattr(obj, 'y') 等同于 del obj.y。
示例
class Dog:
pass
dog1 = Dog()
dog1.color = "黑色"
v = getattr(dog1, 'color', 'xxxxx') # 等同于 v = dog1.color
v = getattr(dog1, 'kinds') # 出错,没有dog1.kinds属性
v = getattr(dog1, 'kinds', '没有这个属性') # v= '没有这个属性'
print("v:", v)
print(hasattr(dog1, 'color')) # True
print(hasattr(dog1, 'kinds')) # False
setattr(dog1, 'kinds', '京巴') # 等同于dog1.kinds ='京巴'
print(dog1.kinds)
print(hasattr(dog1, 'kinds')) # True
delattr(dog1, 'kinds') # 等同于 del dog1.kinds
print(hasattr(dog1, 'kinds')) # False