Python魔法方法学习笔记二
目录
-
更多分享:http://www.catbro.cn
-
继续上篇,本篇我们将继续学习python的魔法方法。
一、基本的序列和映射规则
-
序列和映射是对象的集合,为了实现它们的基本规则,如果对象是不剋安的那么使用
_len_(self)
、_getitem_(self,key)
两个魔方方法,如果对象是可变的,那么使用_len_(self)
、_getitem_(self,key)
、_setitem_(self,key,value)
、_delitem_(self,key)
四个魔法方法 -
_len_(self)
:返回集合中所含项目的数量。 1、对于序列来说是元素的个数 2、对于映射来说是key-value对的数量 3、如果返回0且没有实现重写该行为为_nonzero_
就会被当作一个布尔变量中的假值处理 -
_getitem_(self,key)
:返回与所给键对应的值。 1、对于序列来说应该是0~n-1的整数或者负数 2、对于映射来说可以使用任何种类的键 -
_setitem_(self,key,value)
:按一定的方式存储和key相关的值,该值可以使用_getitem_(self,key)
获取。 1、只能为可以修改的对象定义该方法 -
_delitem_(self,key)
:在对一部分对象使用del语句时调用该方法,同时必须删除和元素相关的键 1、为可修改对象定义。
我们来定义一个
class ArithmeticSequence:
def __init__(self,start=0,step=1):
self.start = start;
self.step = step;
self.changed={};
def checkIndex(self,key):
if not isinstance(key,int):
raise TypeError;
if key<0:
raise IndexError;
def __getitem__(self, item):
print('getItem be called')
self.checkIndex(item);
try:
return self.changed[item];
except KeyError:
return self.start+self.step*item;
def __setitem__(self, key, value):
print('setItem be called')
self.checkIndex(key);
self.changed[key]= value;
-
调用:
s = ArithmeticSequence(); print(s[6]) s[3] = 'hello'; print(s[3]) del s[3]
-
输出:
getItem be called 6 setItem be called getItem be called hello Traceback (most recent call last): del s[3] AttributeError: __delitem__
-
从输出可以看到,取值和设置值都调用了相应的魔法方法,因为我们没有实现
_del_
,所以调用del时报错了。 -
我们也没有实现
_len_
因为它是无限长的。 -
魔法名称的用途有很多,我们只学习了常用的一小部分,大部分特殊的方法都是为高级的用法准备的,感兴趣的可以参考Python 参考手册中相关内容继续深入学习,也可以给我留言共同讨论学习