Python类支持属性,这些属性看起来像常规的对象变量,但是可以附加自定义行为和文档。
class MyClass(object): def __init__(self): self._my_string= "" @property def string(self): """一个非常重要的字符串。""" return self._my_string @string.setter def string(self, new_value): assert isinstance(new_value, str), \ "Give me a string, not a %r!" % type(new_value) self._my_string= new_value @string.deleter def x(self): self._my_string= None
对象的类的MyClass会出现有有一个属性.string,但它的行为是现在严格控制:
mc = MyClass() mc.string = "String!" print(mc.string) del mc.string
除了上述有用的语法外,属性语法还允许进行验证或将其他增强功能添加到这些属性中。这对于公共API可能特别有用-应向用户提供一定程度的帮助。
属性的另一种常见用法是使类能够呈现“虚拟属性”,即实际上并未存储但仅在请求时才计算的属性。
class Character(object): def __init__(name, max_hp): self._name= name self._hp= max_hp self._max_hp= max_hp # 通过不提供设置方法使hp只读 @property def hp(self): return self._hp # 通过不提供set方法使名称只读 @property def name(self): return self.name def take_damage(self, damage): self.hp-= damage self.hp= 0 ifself.hp<0 else self.hp @property def is_alive(self): returnself.hp!= 0 @property def is_wounded(self): returnself.hp<self.max_hpifself.hp> 0 else False @property def is_dead(self): return not self.is_alive bilbo = Character('Bilbo Baggins', 100) bilbo.hp # 出:100 bilbo.hp = 200 # out:AttributeError:无法设置属性 # hp属性是只读的。 bilbo.is_alive # 出:真 bilbo.is_wounded # 出:错误 bilbo.is_dead # 出:错误 bilbo.take_damage( 50 ) bilbo.hp # 出:50 bilbo.is_alive # 出:真 bilbo.is_wounded # 出:真 bilbo.is_dead # 出:错误 bilbo.take_damage( 50 ) bilbo.hp # 出:0 bilbo.is_alive # 出:错误 bilbo.is_wounded # 出:错误 bilbo.is_dead # 出:真