Python 类的 init 函数将自己的类的实例作为默认参数

Posted

技术标签:

【中文标题】Python 类的 init 函数将自己的类的实例作为默认参数【英文标题】:Python class's init function takes instance of own class as default parameter 【发布时间】:2020-05-02 02:21:44 【问题描述】:

我正在尝试定义一个类,该类为其 init 函数采用默认参数。我定义了一个类如下:

class Node:
    def __init__(self,name,visited=False,distance=math.inf,path=Node('-')):
        self.name = name
        self.visited = visited
        self.distance = distance
        self.path = path

我收到以下错误:

NameError:名称“节点”未定义

我能够通过“预定义”我需要的类的部分来解决这个问题,如下所示:

class Node:
    def __init__(self,name):
        self.name = name

class Node:
    def __init__(self,name,visited=False,distance=math.inf,path=Node('-')):
        self.name = name
        self.visited = visited
        self.distance = distance
        self.path = path

但我无法摆脱这种感觉,有一种更好、更 Pythonic 的方式。

【问题讨论】:

为什么类把自己作为参数? path 应该是您要设置为默认值的 Node 对象吗? 当然,但是虚拟节点是指向它自己,还是指向某个 other Node 对象?当尚不存在任何其他 Nodes 时,第一个存在的 Node 指向什么? 在阅读了 juanpa 的回答后,我明白了你的意思。我接受了他的“默认路径”解决方案。 另一种选择是使用哨兵对象作为该节点的默认值,即使只是SENTINEL = object() 【参考方案1】:

你应该这样做:

class Node:
    def __init__(self, name, visited=False, distance=math.inf, path=None):
        self.name = name
        self.visited = visited
        self.distance = distance
        if path is None:
            self.path = Node('-', path="default-path")
        else:
            self.path = path

这是您应该遵循的习惯用法,以可变的默认参数开头。

但是,你需要默认有一个路径,否则它会不停地递归。

【讨论】:

我很确定这会永远重复,因为您创建的新节点需要自己的 path 值。 @Blckknght 是的,是的

以上是关于Python 类的 init 函数将自己的类的实例作为默认参数的主要内容,如果未能解决你的问题,请参考以下文章

创建一个继承自函数创建的类的python类

python类的的使用

Python_类与实例的属性关系

python元类深入解析

面向对象,类

简述Python中的类与对象