重写一下四个魔法方法,即可控制对象的属性访问
1.__getattr__(self,name)
定义当用户试图获取一个不存在的属性时的行为
2.__getattribute__(self,name)
定义当该类的属性被访问时的行为(先于__getattr__(self,name)执行)
3.__setattr__(self,name,value)
定义当一个属性被设置时的行为
4.__delattr__(self,name)
>>> c.x=2
setattr
>>> c.s
getattrbute
>>> c.square=10
>>> c.height
10
>>> c.width
10
>>>
>>> c.__dict__
{'width': 10, 'height': 10}
1.__getattr__(self,name)
定义当用户试图获取一个不存在的属性时的行为
2.__getattribute__(self,name)
定义当该类的属性被访问时的行为(先于__getattr__(self,name)执行)
3.__setattr__(self,name,value)
定义当一个属性被设置时的行为
4.__delattr__(self,name)
定义一个属性被删除时的行为
例一
class C:
def __getattribute__(self,name):
print('getattrbute')
return super().__getattribute__(name)
def __getattr__(self,name):
print('getattr')
def __setattr__(self,name,value):
print('setattr')
super().__setattr__(name,value)
def __delattr__(self,name):
print('delattr')
>>> c = C()
>>> c.x=2
setattr
>>> c.s
getattrbute
getattr
例二
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:
super().__setattr__(name,value) #或者改为self.__dict__[name] = value
#对象有一个特殊属性.__dict__ 作用是以字典的形式显示当前对象所有的属性以及对应的值
>>> c=Rectangle()
>>> c.square=10
>>> c.height
10
>>> c.width
10
>>>
>>> c.__dict__
{'width': 10, 'height': 10}