__getattribute__(self, item):
__getattr__(self, item):
__setattr__(self, key, value):
__delattr__(self, item):
先定义一个类用来做实验:
class C:
def __getattribute__(self, item):
print('getattribute')
return super().__getattribute__(item) #默认继承object类
def __getattr__(self, item):
print('getattr')
def __setattr__(self, key, value):
print('setattr')
super().__setattr__(key,value)
def __delattr__(self, item):
print('delattr')
super().__delattr__(item)
c1=C()
print(c1.x)
c1.x=1
print(c1.x)
del c1.x
#死循环陷阱 -- 矩形类例子
class Rectangle():
def __init__(self, w=0, h=0):
self.width=w
self.height=h
def __setattr__(self, name, value):
if name=='square':
self.width=value
self.height=value
else:
self.name=value #无限递归__setattr__,会错误 无限次调用本类的赋值方法
def getArea(self):
return self.width*self.height
r1=Rectangle(4,5)
print(r1.getArea())
r1.square=10
print(r1.getArea())
print(r1.__dict__)
r1.width=5 #尝试只改变width属性
print(r1.getArea())
print(r1.__dict__)
class Rectangle():
def __init__(self, w=0, h=0):
self.width=w
self.height=h
def __setattr__(self, name, value):
if name=='square':
self.width=value
self.height=value
else:
super().__setattr__(name,value) #推荐:方法一:调用基类方法
def getArea(self):
return self.width*self.height
r1=Rectangle(4,5)
print(r1.getArea())
r1.square=10
print(r1.getArea())
print(r1.__dict__)
r1.width=5 #尝试只改变width属性
print(r1.getArea())
print(r1.__dict__)
class Rectangle():
def __init__(self, w=0, h=0):
self.width=w
self.height=h
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
r1=Rectangle(4,5)
print(r1.getArea())
r1.square=10
print(r1.getArea())
print(r1.__dict__)
r1.width=5 #尝试只改变width属性
print(r1.getArea())
print(r1.__dict__)
class C:
def __init__(self,size=10):
self.size=size
def getSize(self):
return self.size
def setSize(self,value):
self.size=value
def deleteSize(self):
del self.size
x=property(getSize,setSize,deleteSize)
c1.x=100
print(c1.x)
del c1.x