Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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 在ATTR中,验证属性类型是否为封闭类_Python_Python 3.x_Tree - Fatal编程技术网

Python 在ATTR中,验证属性类型是否为封闭类

Python 在ATTR中,验证属性类型是否为封闭类,python,python-3.x,tree,Python,Python 3.x,Tree,我想编写一个树Node类,其中包含Node子级,使用,并进行验证 由于节点尚不存在,因此无法编译以下内容- from attr import attrs, attrib from attr.validators import instance_of @attrs class Node: left = attrib(validator=instance_of(Node)) right = attrib(validator=instance_of(Node)) 有什么建议可以让我

我想编写一个树
Node
类,其中包含
Node
子级,使用,并进行验证

由于
节点
尚不存在,因此无法编译以下内容-

from attr import attrs, attrib
from attr.validators import instance_of

@attrs
class Node:
    left = attrib(validator=instance_of(Node))
    right = attrib(validator=instance_of(Node))
有什么建议可以让我达到我想要的行为吗


谢谢

您可以创建一个虚拟
节点
类(将此对象称为a),这样它就成为一个注册名称以避免
名称错误
,然后您可以创建您的普通类,确保从虚拟类继承(将此对象称为B)

从技术上讲,对象A的名称已被覆盖,但仍保留对它的引用。因此,当您调用
Node()
时,实际上是在处理对象B。这是对象A和对象B的类型,但在
instance\u()中检查的类型严格来说是对象A。这对我们来说很好,但解释了为什么继承很重要

class Node:
    pass

# This won't work because every `Node` we initialise will be strictly object B,
# but the validator requires a type of object A
@attrs
class Node:
    left = ...
由于某些节点不可避免地必须是叶子,因此还必须允许
非类型
。最后,提供默认值意味着您可以将节点初始化为
node()
,而不是
node(None,None)
。比如说,

>>> tree = Node(right=Node(Node()))
>>> tree
Node(left=None, right=Node(left=Node(left=None, right=None), right=None))

这不是一个解决方案,但是您是否也希望能够将属性设置为“无”?
>>> tree = Node(right=Node(Node()))
>>> tree
Node(left=None, right=Node(left=Node(left=None, right=None), right=None))