介绍
属性是类与对象的一大特征,对属性的访问,Python提供了一些魔法方法,它们在访问属性时自动调用
方法 | 说明 |
---|---|
__ getattr__(self,other) | 定义当用户试图获取一个不存在属性时的行为 |
__ getattribute__(self,other) | 定义当该类的属性被访问时的行为,返回一个属性 |
__ setattr__(self,name,value) | 定义一个属性被设置时的行为 |
__ delattr__(self,name) | 定义一个属性被删除时的行为 |
class OO():
def __getattribute__(self,name): #首先被访问
print("getattribute")
return super().__getattribute__(name) #访问可以使用返回语句return,返回其所访问的值
def __getattr__(self , name ): #super().getattribute(name)只有一个参数,需要返回的是方法,不需传入对象
print("getattr")
#super().__getattr__(name)
def __setattr__(self,name,value):
print("setattr")
super().__setattr__(name,value)
def __delattr__(self,name):
print("delattr")
super().__delattr__(name)
>>> o = OO()
>>> o.x
getattribute
getattr
>>> o.x = 2
setattr
>>> del o.x
delattr
- 可见其首先会调用
getattribute
函数,没有该属性时,会调用getattr
函数,进行创建 - 对于
setattr(self,name,value)
即对对象的属性进行赋值,name
是对象属性的名称object.name = value
当用户进行类似操作时,setattr
函数自动被调用
class Rectangle():
def __init__(self,hight = 0,width = 0):
self.hight = hight
self.width = width
def __setattr__(self,name,value): #name是调用的属性名称
if name == "square":
self.hight = value
self.width = value
else:
self.name = value #该方法会造成递归死循环,只要对属性进行赋值,就会
def getArea(self): #找setattr函数
return self.hight * self.width
进行改进:
- 利用
super()
函数调用父类方法,无继承新类时,调用object父类方法
super().__setattr__(name,value) #只是调用方法,不需要传入self实例化对象
- 利用类与对象的字典属性
dict __ dict__[key]
属性是类与对象的特殊属性
- 其作用是:以键值对的形式显示当前对象的所有属性,提供修改键值对的方法
self.__dict__[name] = value #self是实例化后的对象