在访问类属性的时候,有一些方法在需要的时候自动被调用:
# 魔法方法——属性访问
__getattr__(self,name) # 当用户试图获取一个不存在的属性时,自动调用该方法
__getattribute__(self,name) # 当该类属性被访问时
__setattr__(self,name,value) # 当一个属性被设置时
__delattr__(self,name) # 当一个属性被删除时
例子:
写一个矩形类,默认有宽、高两个属性
如果为一个叫square的属性赋值,则说明这是个正方形,此时宽高都重写为square的属性值
class Rectangle:
# 初始化
def __init__(self, width=0, height=0):
self.width = width # 为宽赋值,此处也会自动调用__setattr__方法
self.height = height # 为高赋值,此处也会自动调用__setattr__方法
# 当为属性赋值时自动调用
def __setattr__(self, key, value):
if key == 'square':
self.width = value
self.height = value
else:
# 此处不可使用:self.key = value,直接赋值会自动调用本类中改写过的__setattr__方法,导致无限递归
super().__setattr__(key, value) # 在这里调用父类中为改写的__setattr__方法,爸爸写的方法肯定没啥错
# self.__dict__[key] = value # 也可以这么写:__dict__:以字典的形式返回对象的所有属性和值
# 返回面积
def getArea(self):
return self.width * self.height
运行结果:
>>> c = Rectangle(5,10)
>>> print(c.getArea())
>>> c.square = 10
>>> print(c.getArea())
50
100