在 Python 中遇到 "self"

Encountered "self" in Python

我刚开始学习python,我正在尝试编写一个二叉搜索树。 Eclipse 没有显示任何错误,但是当我尝试 运行 时出现错误

Encountered "self" at line 5

第 5 行是:

"self.left = left"

问题是什么?我写代码的方式好吗?我刚看完 python.

class Node:

    def _init_(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right 

    def add_node(self, data):
        if self.data is None:
            node = Node(data)
            self = node
        if self.data > data:
            self.add_node(self.left, data)
        else:
            self.add_node(self.right, data)

    def print_nodes(self):
        if self.left is not None:
            self.print_nodes(self.left)
        print(self);
        if self.right is not None:
            self.print_nodes(self.right)

    def _str_(self):
        print(self.data)

class binary_tree:

    def _init_(self):
        self.root = None

    def getRoot(self):
        return self.root

    def add(self, data):
        self.root.add_node(data)

    def print_all(self):
        self.root.print_nodes();

此处对您的代码进行了一些修复

class Node:

    def __init__(self, data, left=None, right=None):
        self.data  = data
        self.left  = left
        self.right = right 

    def add_node(self, data):
        if self.data > data:
            if self.left is None:
                self.left = Node(data)
            else:
                self.left.add_node(data)
        elif self.data < data:
            if self.right is None:
                self.right = Node(data)
            else:
                self.right.add_node(data)

    def print_nodes(self):
        if self.left is not None:
            self.left.print_nodes()
        print(self);
        if self.right is not None:
            self.right.print_nodes()

    def __str__(self):
        return str(self.data)

class binary_tree:

    def __init__(self):
        self.root = None

    def getRoot(self):
        return self.root

    def add(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self.root.add_node(data)

    def print_all(self):
        if self.root is None:
            print("Empty tree")
        else:
            self.root.print_nodes()

如前所述,python的特殊方法是__init____str__,所有魔术方法都以__开始和结束。

我修复了你的 add_node 因为你的递归调用是错误的,你做了 self.add_node(self.left,data) self 实例作为第一个参数隐式传递给该函数,self.left 是第二个和 data 第三个但定义为 add_node 只接受 2 个参数,所以这是一个错误,所以在这种情况下,如果你想调用 self.leftadd_node 就完成了通过 self.left.add_node 并且同样适用于对 class

方法的所有其他调用

看看:

a first look at classes

basic customization and magic methods

这里是这棵树的示例用法

>>> tree = binary_tree()
>>> tree.print_all()
Empty tree
>>> tree.add(23)
>>> tree.print_all()
23
>>> tree.add(10)
>>> tree.add(42)
>>> tree.print_all()
10
23
42
>>> root = tree.root
>>> root.data
23
>>> root.right
<__main__.Node object at 0x0000000003559160>
>>> root.right.data
42
>>> root.left
<__main__.Node object at 0x0000000003577080>
>>> root.left.data
10
>>>     

另一件事是,在 python 中你不需要定义 getter 或 setter 除非你想控制设置什么和如何设置属性或 return 它以与实际对象不同的特殊方式。

运行 这在 python 的 IDLE 中或在交互模式下作为 python3 -i binarytree.py 或在您最喜欢的 python.

的解释中