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

原文地址:https://www.cnblogs.com/marvintang1001/p/11156514.html

时间: 2024-10-09 12:29:33

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

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight

二叉搜索树的相关操作

操作包括二叉搜索树的创建,插入,搜索,寻找前驱后继,删除,左右旋转,插入元素为根结点,以及两棵二叉树的合并. 二叉树的创建很简单,只需要设置 value, left child, right child 即可. 插入的时候递归插入树中合适的位置,通过比较插入元素的值与根结点元素的值,如果小于则递归插入到左子树中,否则递归插入到右子树中. 搜索的时候与插入类似,比较要搜索的值和根结点元素值的大小,若小于则递归到左子树中去查找,否则递归到右子树中去查找. 寻找前驱的方式是在左子树的右结点中去递归寻找

将对象转为数组方法:延伸array_map函数在PHP类中调用内部方法

public static function objectToArray($d) { if (is_object($d)) { $d = get_object_vars($d); } if (is_array($d)) { return array_map(array(__CLASS__, __FUNCTION__), $d); } else { return $d; } } array_map(array(__CLASS__, __FUNCTION__), $d)解释: 我们可以在PHP手册中

获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 获取Class对象的三种方式 * 1 Object --> getClass(); * 2 任何数据类型(包括基本数据类型)都有一个静态的class属性 * 3 通过Class类的静态方法:forName(String className)(常用) * * * 注意:在运行期间,一个类,只有一个Class对象产

leetCode 96.Unique Binary Search Trees (唯一二叉搜索树) 解题思路和方法

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example, Given n = 3, your program should return all 5 unique BST's shown below. 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 confused what "{1,#,2,3}

二叉搜索树的建立、查找、删除等相关操作实现及对于删除操作的详细解释

前记,最近开始了保研准备,故记录一下复习过程. 这次就对二叉树做一下实现. 在以下操作中,稍复杂的应该是删除,本想采用递归的方式构造删除函数,奈何最后还是按照自己的想法写了,本博客将对我的实现稍作描述,如有错误请指正,实现的方法中肯定也有很多累赘之处,也请多多指出. 首先将所有的情况分为三种: 被删除的节点没有儿子节点,对应(1). 被删除的节点有一个儿子节点,此时只需要将儿子节点上移至原有的节点处,对应(2). 被删除的节点有两个儿子节点,此时可以选择左子树的最大值或者右子树的最小值对应的节点

二叉搜索树的递归和非递归的插入方法

#include<iostream>#include<vector>#include<queue>#include<string>#include<map>using namespace std;bool flag=true;struct node{ float val; node* left,*right; node(float _val):val(_val),left(NULL),right(NULL){}}; node* insertnot

C++二叉搜索树(带父亲节点,2种节点删除方法的比较.)

这里写代码片#include <iostream> #include <iomanip> using namespace std; template<typename Type> class BSTNode { public: Type data; BSTNode<Type> *left; BSTNode<Type> *right; BSTNode<Type> *parent;//带父亲节点的搜索二叉树. BSTNode(Type d

leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example, Given n = 3, your program should return all 5 unique BST's shown below. 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 confused what "{1,#,2,3}