045魔法方法:属性访问

属性访问:
__getattr__(self,name)
  定义当用户试图获取一个不存在的属性时的行为

__getattribute__(self,name)
  定义当该类的属性被访问时的行为

__setattr__(self,name,value)
  定义当用一个属性被设置时的行为

__delattr__(self,name)
  定义当用一个属性被删除时的行为


例:>>> class C:
  ...     def __getattribute__(self, name):
          # 使用 super() 调用 object 基类的 __getattribute__ 方法
  ...         print('getattribute')
  ...         return super().__getattribute__(name)
  ...     
  ...     def __setattr__(self, name, value):
  ...         print('setattr')
  ...         super().__setattr__(name, value)
  ...     def __delattr__(self, name):
  ...         print('delattr')
  ...         super().__delattr__(name)
  ...     def __getattr__(self, name):
  ...         print('getattr')
  ...
  >>> c = C()
  >>> c.x
  getattribute
  getattr
  >>> c.x = 1
  setattr
  >>> c.x
  getattribute
  1
  >>>del c.x
  delattr


练习:
写一个矩形类,默认有宽和高两个属性;
如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。
class Rectangle:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height
 
    def __setattr__(self, name, value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            self.__dict__[name] = value   #注意,避免进入死循环
 
    def getArea(self):
        return self.width * self.height


posted @ 2015-10-21 07:07  淡蓝色的天空很美  阅读(297)  评论(0编辑  收藏  举报