python3 与dict相关的魔法方法。使用于二叉搜索树的类中

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

posted @ 2019-07-09 12:14  Marvin_Tang  阅读(551)  评论(0编辑  收藏  举报