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 参考手册中相关内容继续深入学习,也可以给我留言共同讨论学习