🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 概述 同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过`__dict__`的方式来静态的储存属性。 Python提供了多种即时生成属性的方法。其中一种称为**特性**(property)。特性是特殊的属性。比如我们为chicken类增加一个特性adult。当对象的age超过1时,adult为True;否则为False。 #### 方案1 --> 通过对象方法实现 ``` class chicken(bird): fly = False def __init__(self, age): self.age = age def getAdult(self): if self.age > 1.0: self.adult = True else: self.adult = False ``` 获得adult对象属性的方法 ``` >>> summer = chicken(2) #实例化 >>> summer.getAdult() #调用getAdult()方法,给adult属性赋值 >>> summer.adult #获取adult属性 ``` #### 方案2 --> 使用三元选择,实用性较低 ``` class bird(object): feather = True class chicken(bird): fly = False def __init__(self, age): self.age = age self.adult = True if self.age > 1.0 else False ``` 获得adult对象属性的方法 ``` >>> summer = chicken(2) #实例化 >>> summer.adult #获取adult属性 ``` #### 方案3 使用property,实用性更强 ``` class bird(object): feather = True class chicken(bird): fly = False def __init__(self, age): self.age = age def getAdult(self): if self.age > 1.0: return True else: return False adult = property(getAdult) # @property # def adult(self): # if self.age > 1.0: return True # else: return False ``` 获得adult对象属性的方法 ``` >>> summer = chicken(2) #实例化 >>> summer.adult #获取adult属性 ``` #### 方案4 使用特殊方法__getattr__ ``` class bird(object): feather = True class chicken(bird): fly = False def __init__(self, age): self.age = age def __getattr__(self, name): if name == 'adult': if self.age > 1.0: return True else: return False else: raise AttributeError(name) ``` 每个特性需要有自己的处理函数,而`__getattr__`可以将所有的即时生成属性放在同一个函数中处理。`__getattr__`可以根据函数名区别处理不同的属性。比如上面我们查询属性名male的时候,raise AttributeError。 (Python中还有一个`__getattribute__`特殊方法,用于查询任意属性。`__getattr__`只能用来查询不在`__dict__`系统中的属性) `__setattr__`(self, name, value)和`__delattr__`(self, name)可用于修改和删除属性。它们的应用面更广,可用于任意属性。