在Python中,你是否可以拥有成员的类,这些成员本身就是指向同一类类型成员的指针?例如,在C中,对于二叉树中的节点,您可能具有以下类:
struct node {
int data;
struct node* left;
struct node* right;
}
你如何在python中等效地创建它?
答案 0 :(得分:8)
在Python中模拟C结构(使用str而不是int作为数据类型):
“声明”:
class Node(object):
data = None # str
left = None # Node object or None
right = None # Node object or None
用法:
root = Node()
root.data = "foo"
b = Node()
b.data = "bar"
root.left = b
z = Node()
z.data = "zot"
root.right = z
答案 1 :(得分:7)
Python是一种动态语言。属性可以在任何时候(几乎)与任何类型绑定。因此,Python中不存在您所描述的问题。
答案 2 :(得分:2)
我如何在python中等效创建它?
class node( object ):
def __init__( self, data, left, right ):
self.data = data
self.left = left
self.right = right
由于所有Python变量实际上都是无类型引用,因此您不必事先提及左侧和右侧将成为节点的实例。
答案 3 :(得分:2)
你不能在Python中声明类型 - 因此,在Python中声明类型没有问题。
答案 4 :(得分:1)
正如其他答案所指出的那样,由于动态类型并不是问题,实际上,对于Python3而言,当涉及到类型注释时,这是一个非常现实的问题。并且这将不起作用(请注意method参数的类型注释):
class A:
def do_something_with_other_instance_of_a(self, other: A):
print(type(other).__name__)
instance = A()
other_instance = A()
instance.do_something_with_other_instance_of_a(other_instance)
导致:
def do_something_with_other_instance_of_a(self, other: A):
NameError: name 'A' is not defined
更多有关问题性质的信息: https://www.python.org/dev/peps/pep-0484/#the-problem-of-forward-declarations
,这是您必须使代码与Python早期版本兼容的唯一方法。
相反,为了在我的IDE(PyCharm)中获得自动补全功能,您可以这样编写文档字符串:
更新: 或者,您可以在注释中使用“类型:”注释,而不是使用文档字符串。这也将确保mypy静态类型检查将起作用(mypy似乎并不关心文档字符串):
答案 5 :(得分:0)