作者:Vamei 出处:http://www.cnblogs.com/vamei
03、对象的属性
Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。
- 属性的__dict__系统
对象的属性储存在对象的dict属性中。dict为一个词典,键为属性名,对应的值为属性本身。我们看下面的类和对象。chicken类继承自bird类,而summer为chicken类的一个对象。
class bird(object):
feather=True
class chicken(bird):
fly=False
def __init__(self,age):
self.age=age
summer=chicken(2)
print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)
输出:
{'__module__': '__main__',
'feather': True,
'__dict__': <attribute '__dict__' of 'bird' objects>,
'__doc__': None}
{'__module__': '__main__',
'fly': False,
'__init__': <function chicken.__init__ at 0x00000288B1BC6510>,
'__doc__': None}
{'age': 2}
第一行为bird类的属性,比如feather。第二行为chicken类的属性,比如fly和__init__方法。第三行为summer对象的属性,也就是age。有一些属性,比如__doc__,并不是由我们定义的,而是由Python自动生成。此外,bird类也有父类,是object类(正如我们的bird定义,class bird(object))。这个object类是Python中所有类的父类。
可以看到,Python中的属性是分层定义的,比如这里分为object/bird/chicken/summer这四层。当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现再不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。
当我们有一个summer对象的时候,分别查询summer对象、chicken类、bird类以及object类的属性,就可以知道summer对象所有的__dict__,就可以找到通过对象summer可以调用和修改的所有属性了。
注:可以通过__class__来找到对象的类,通过__base__来查找某一个类的父类,如:
print(summer.__class__)
print(chicken.__base__)
print(bird.__base__)
输出:
<class '__main__.chicken'>
<class '__main__.bird'>
<class 'object'>
- 特性
特性使用内置函数property()来创建。
property()最多可以加载四个参数。前三个参数为函数,分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档,可以为一个字符串,起说明作用。
class num(object):
def __init__(self, value):
self.value=value
def getNeg(self):
return -self.value
def setNeg(self,value):
self.value=-value
def delNeg(self):
print("Value also deleted")
del self.value
neg=property(getNeg,setNeg,delNeg,"I'm negative")
x=num(1.1)
print(x.neg) #自动执行getNeg
x.neg=-22 #自动执行setNeg
print(x.value)
print(num.neg.__doc__) #查看neg的说明文档
del x.neg #自动执行delNeg
输出:
-1.1
22
I'm negative
Value also deleted
使用特殊方法__getattr__
我们可以用__getattr__(self, name)来查询即时生成的属性。当我们查询一个属性时,如果通过__dict__方法无法找到该属性,那么Python会调用对象的__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)
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
print(summer.male)
输出:
True
False
Traceback (most recent call last):
File "C:\Users\DXT-\Desktop\python\code\python 基础\对象.py", line 492, in <module>
print(summer.male)
File "C:\Users\DXT-\Desktop\python\code\python 基础\对象.py", line 481, in \__getattr__
else:raise AttributeError(name)
AttributeError: male
每个特性需要有自己的处理函数,而__getattr__可以将所有的即时生成属性放在同一个函数中处理。__getattr__可以根据函数名区别处理不同的属性。比如上面我们查询属性名male的时候,raise AttributeError。
本文深入探讨了Python中对象属性的管理方式,包括属性的__dict__系统、特性(property)的创建及使用,以及如何通过__getattr__方法实现动态属性查询。

179

被折叠的 条评论
为什么被折叠?



