Python的魔术方法一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__、 __setitem__(subscriptable所需method), __delitem__(del obj[key]所需method), __len__(len(…)所需method)等。
在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__、__setitem__、__delitem__、__len__方法去模拟。
魔术方法的作用:
__getitem__(self,key):返回键对应的值。
__setitem__(self,key,value):设置给定键的值
__delitem__(self,key):删除给定键对应的元素。
__len__():返回元素的数量
这些魔术方法的原理就是:当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。
原文:https://blog.csdn.net/liweiblog/article/details/54907888
实例:
在二叉搜索树中定义__setitem__方法能模仿dict中增加键-值对,__getitem__模仿dict获取value
具体实现:
class BinarySearchTree(object): def __init__(self): self.root = None self.size = 0 def length(self): return self.size def __len__(self): return self.size
# 增加dict def put(self, key, value): if self.root: self._put(key, value, self.root) else: self.root = TreeNode(key, value) self.size = self.size + 1 def _put(self, key, value, currentNode): if key < currentNode.key: if currentNode.hasLeftChild(): self._put(key, value, currentNode.leftChild) else: currentNode.leftChild = TreeNode(key, value, parent=currentNode) elif key == currentNode.key: currentNode.value = value else: if currentNode.hasRightChild(): self._put(key, value, currentNode.rightChild) else: currentNode.rightChild = TreeNode(key, value, parent=currentNode) def __setitem__(self, key, value): self.put(key, value)
# 获取value: def get(self, key): if self.root: res = self._get(key, self.root) if res: return res.value else: return None else: return None def _get(self, key, currentNode): if currentNode is None: return None elif currentNode.key == key: return currentNode elif currentNode.key > key: return self._get(key, currentNode.leftChild) else: return self._get(key, currentNode.rightChild) def __getitem__(self, item): return self.get(item)
效果:
tree = BinarySearchTree()
tree[16] = 'a'
print(tree[16])
-- a