Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的自引用类?_Python_Class - Fatal编程技术网

python中的自引用类?

python中的自引用类?,python,class,Python,Class,在Python中,是否可以让类的成员本身就是指向同一类类型成员的指针?例如,在C中,二叉树中的节点可能有以下类: struct node { int data; struct node* left; struct node* right; } 如何在python中等效地创建它?python是一种动态语言。属性可以(几乎)在任何时间以任何类型绑定。因此,您描述的问题在Python中不存在。在Python中模拟C结构(使用str而不是int作为数据类型): class n

在Python中,是否可以让类的成员本身就是指向同一类类型成员的指针?例如,在C中,二叉树中的节点可能有以下类:

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

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

python是一种动态语言。属性可以(几乎)在任何时间以任何类型绑定。因此,您描述的问题在Python中不存在。

在Python中模拟C结构(使用str而不是int作为数据类型):

class node( object ):
    def __init__( self, data, left, right ):
        self.data = data
        self.left = left
        self.right = right
“宣言”:

用法:

root = Node()
root.data = "foo"

b = Node()
b.data = "bar"
root.left = b

z = Node()
z.data = "zot"
root.right = z

是使用该结构创建的示例二叉树。

如何在python中等效地创建它

class node( object ):
    def __init__( self, data, left, right ):
        self.data = data
        self.left = left
        self.right = right

由于所有Python变量实际上都是无类型引用,所以您不必预先提到左侧和右侧都将是节点的实例。

您不能在Python中声明类型-因此,在Python中声明类型没有问题。

而正如其他答案所指出的,由于动态类型,这不是一个问题,事实上,对于Python3来说,当涉及到类型注释时,这是一个非常现实的问题。这将不起作用(请注意方法参数的类型注释):

结果:

   def do_something_with_other_instance_of_a(self, other: A):
   NameError: name 'A' is not defined
有关问题性质的更多信息,请参见:

可以使用字符串文字来避免转发引用

另一种方法是在这种情况下不使用python3样式的类型注释, 如果必须使代码与早期版本的Python兼容,这是唯一的方法

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

更新: 或者,您可以在注释中使用“type:”annotations,而不是使用docstring。这也将确保mypy静态类型检查能够工作(mypy似乎并不关心docstring):


这些是指向类的指针,而不是同一个类。在任何语言中,都不能有一个包含自己类型成员的类。这是一个无限递归,你说得对。我道歉。然而,这个问题仍然是相关的。这不是真的,看看Java中的一个简单链表示例:@ridecar2,这些字段是指向堆上对象的指针。@ridecar2,@Daniel Pryden:我的措辞不准确。在我所说的话中,这可以理解为是不正确的。我的意思更多的是从内存布局的角度:内存的实际结构不能包含在内存本身中。在Java之类的东西中,引用或指针会处理这个问题,这正是问题中的结构所做的。我并不是说递归数据的概念是不可能的(这就是二叉树节点的含义:))您在这里声明的是类成员,不是实例成员,是吗?对不起,有人能解释一下上面的评论吗?@AmMessage:您可能想查看答案和/或从中阅读该页。@Russell Borogove:您从未意识到什么?实例继承了类变量。我想我在第一次学习Python OO时遇到了一些令人困惑的行为,从那时起我就完全避免使用类变量。我在init中设置了所有的实例默认值。嗯?这并没有回答OP的问题““您将如何用python等效地创建它?”@John Machin:显然OP认为是这样的,因为他接受了答案。:)@John:虽然他写了“如何用python等价地创建它?”,但他实际上问的是“如何声明具有当前类类型的成员?”。当然,答案是您不需要,因为您不需要使用Python。@musicfreak:“显然”???OP的鼠标点击了“勾号”按钮——这既不能证明你的想法,也不能证明你的接受度。@John:多年来在IRC上提供支持的经验告诉你,人们并不总是问他们想要回答的问题。
   def do_something_with_other_instance_of_a(self, other: A):
   NameError: name 'A' is not defined