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
# 出:真