__getattr__和__setattt__使用

# coding:utf-8
"""
__setattr__(self, name, value),如果要给name赋值,调用此方法
__getattr__(self, name) 如果name被访问,同时它不存在的时候,此方法被调用
__getattribute__(self, name)  当name被访问时自动被调用(这个进用于新类式),无论name是否存在,都要被调用
__delattr__(self, name) 如果要删除name,这个方法就被调用

"""

class A(object):
    def __getattr__(self, name):    # 读属性,属性不存在时,调用此方法,即所谓的“拦截成员”
        print "You use __getattr__"

    def __setattr__(self, name, value): #给对象赋值时,调用此方法
        print "You use __setattr__"
        self.__dict__[name] = value

class B(object):
    s = 'adg'
    def __getattribute__(self, name):# 新式类,访问属性就掉哦有那个它
        print "You are using __getattribute__"
        return object.__getattribute__(self, name)
        # 返回值没有调用return self.__dict__[name].因为如果调用这样的凡事就会访问self.__dict__,
        # 只要访问这个属性,就要调用__getattribute__,这样就导致了无限递归下去成死循环

#例子
class Rectangle(object):
    """the width and length of Rectangle"""
    def __init__(self):
        self.width = 0
        self.length = 0
    def setSize(self, size):
        self.width,self.length = size
    def getSize(self):
        return self.width,self.length
r = Rectangle()
r.width = 3
r.length = 4
print r.getSize()
r.setSize( (30, 40) )
print r.width
print r.length

"""改进,使用property函数"""
class Rectangle2(object):
    """the width and length of Rectangle"""
    def __init__(self):
        self.width = 0
        self.length = 0
    def setSize(self, size):
        self.width,self.length = size
    def getSize(self):
        return self.width,self.length
    size = property(getSize, setSize)
print "-------property()-------------"
s = Rectangle2()
s.width = 3
s.length = 4
print s.size
r.size = 30,40
print s.width
print s.length

"""@property,方法变成属性"""
class Rectangle3(object):
    def __init__(self):
        self.width = 0
        self.length = 0
    @property
    def size(self):
        return self.width, self.length
    @size.setter
    def size(self,size):
        self.width,self.length = size

print "------@property------------"
s = Rectangle3()
s.width = 3
s.length = 4
print s.size
s.size = 30,40
print s.width
print s.width

"""使用setattr和getattr"""
class Rectangle4(object):
    def __init__(self):
        self.width = 0
        self.length = 0

    def __setattr__(self, key, value):
        if key  == "size":
            self.width, self.length = value
        else:
            self.__dict__[key] = value
    def __getattr__(self, item):
        if item == "size":
            return self.width, self.length
        else:
            raise AttributeError
print "------------setattr,getattr---------"
s = Rectangle4()
s.width = 3
s.length = 4
print s.size
s.size = 30,40
print r.width
print r.length

结果:

(3, 4)
30
40
-------property()-------------
(3, 4)
3
4
------@property------------
(3, 4)
30
30
------------setattr,getattr---------
(3, 4)
30
40

 

posted @ 2016-03-19 19:39  jetlyb  阅读(275)  评论(0编辑  收藏  举报