|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
小牛有话说:
各位鱼油,大家好。我是小牛,时光荏苒,岁月如梭,一晃半年过去了,小牛希望能在新的一年里把前面挖的坑给填起来,也衷心地希望各位鱼油能在阅读帖子过程中有所收获。。。。。。
本期主要内容导读:
这一期我们归纳一下鱼神第四十五讲“魔法方法:属性访问”。这一期里面鱼神首先复习了通过内置函数(getattr(),setattr(),delattr())操作类对象内属性的方法以及通过属性方法来访问属性的方法(property()),在此基础上介绍了访问类对象内属性的方法的魔法方法(__getattr()__,__getattribute__,__setattr__,__delattr__)及注意事项。下面,我们将对上述内容进行详细展开
1. 通过内置函数操作对象内属性的方法
通过一个类定义和对象赋值和调用及删除来介绍三个内置函数getattr(),setattr()和delattr()的使用。
>>> class C:
def __init__(self,size=0):
self.size = size #在构造方法内定义了一个类属性size
>>> a = C()
>>> a.size #直接通过对象名加成员操作符访问属性size
0
>>> getattr(a,'size','木有此属性!') #通过getattr()访问属性size,注意size要加引号
0
>>> getattr(a,'length','木有此属性!')
'木有此属性!'
>>> setattr(a, 'size', 10) #通过setattr()设置属性size,注意size要加引号
>>> getattr(a,'size','木有此属性!')
10
>>> delattr(a,'size') #通过delattr()删除属性size,注意size要加引号
>>> getattr(a,'size','木有此属性!')
'木有此属性!'
2. 基于property()方法,通过属性操作类对象内属性的方法
可以分别定义获得、修改和删除类对象属性的方法,并通过property将这些方法赋值给一个属性,利用此属性来实现对类对象属性的操作
>>> class C:
def __init__(self,size=0):
self.size = size
def getx(self):
return self.size
def setx(self,size):
self.size = size
def delx(self):
del self.size
x = property(getx,setx,delx) # property方法将前面定义的方法赋值给x
>>> m = C()
>>> m.x
0
>>> m.x=5
>>> m.x
5
>>> del m.x
>>> getattr(m,'x','木有此属性!')
'木有此属性!'
3. 操作类对象成员的魔法方法
主要有__getattr()__(),__getattribute__(),__setattr__(),__delattr__()四个魔法方法,其中前两个主要区别是:前者在当所调用的类的对象属性不存在时触发,而后者是在调用类的对象属性时调用,它们的使用方法见下面所示:
>>> class C:
def __init__(self,size=0):
self.size = size #触发__setattr__()方法
def __getattr__(self,size): #当所调用类的对象的属性不存在时触发
print("正在调用getattr()方法!")
def __getattribute__(self,size): #当调用类的对象的属性时触发
print("正在调用getattribute()方法!")
super().__getattribute__(size)
def __setattr__(self,size,value): #当对类的对象的属性赋值时触发
print("正在调用setattr()方法!")
super().__setattr__(size,value)
def __delattr__(self,size): #当删除类的对象的属性时触发
print("正在调用delattr()方法!")
super().__delattr__(size)
>>> m = C()
正在调用setattr()方法!
>>> m.x
正在调用getattribute()方法!
正在调用getattr()方法!
>>> m.size
正在调用getattribute()方法!
>>> m.x = 3
正在调用setattr()方法!
>>> del m.x
正在调用delattr()方法!
但是,使用这些魔法方法时要小心出现死循环,一般的规避措施是尽可能使用super()方法,例如定义一个矩形类,它有两个默认属性:width和height
当为属性square赋值时,自动将width和height相等,另外定义一个获得矩形面积的方法。
>>> class Rectange:
def __init__(self,width=0,height=0):
self.width = width #触发___setattr__()
self.height = height #触发___setattr__()
def __setattr__(self,name,value):
if name == "square": #只有当属性为square时,长和宽相等
self.width = value
self.height = value
else:
super().__setattr__(name,value) #不能直接写成self.name=value,会进入死循环
def getArea(self):
return self.width*self.height
>>> a = Rectange(3,4)
>>> a.getArea()
12
>>> a.square = 5
>>> a.getArea()
25 |
评分
-
查看全部评分
|