目录

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