在 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.left
的 add_node
就完成了通过 self.left.add_node
并且同样适用于对 class
方法的所有其他调用
看看:
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.
的解释中
我刚开始学习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.left
的 add_node
就完成了通过 self.left.add_node
并且同样适用于对 class
看看:
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.