python中的自引用类?

时间:2010-10-07 00:47:48

标签: python class

在Python中,你是否可以拥有成员的类,这些成员本身就是指向同一类类型成员的指针?例如,在C中,对于二叉树中的节点,您可能具有以下类:

struct node {
    int data;
    struct node* left;
    struct node* right;
} 

你如何在python中等效地创建它?

6 个答案:

答案 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

您可以使用字符串文字来避免前向引用

enter image description here

在这种情况下,其他方法不使用python3-style类型注释

,这是您必须使代码与Python早期版本兼容的唯一方法。

相反,为了在我的IDE(PyCharm)中获得自动补全功能,您可以这样编写文档字符串:

using python docstrings instead of type hints to avoid a class self-reference

更新: 或者,您可以在注释中使用“类型:”注释,而不是使用文档字符串。这也将确保mypy静态类型检查将起作用(mypy似乎并不关心文档字符串):

enter image description here

答案 5 :(得分:0)

http://code.activestate.com/recipes/286239-binary-ordered-tree/是使用该结构创建的示例二叉树。