python深入学习笔记3-对象的属性

本文深入探讨了Python中对象属性的管理方式,包括属性的__dict__系统、特性(property)的创建及使用,以及如何通过__getattr__方法实现动态属性查询。

作者: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值