【问题标题】:Python class's init function takes instance of own class as default parameterPython 类的 init 函数将自己的类的实例作为默认参数
【发布时间】: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()

标签: python class parameters default init


【解决方案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 是的,是的
猜你喜欢
  • 2015-11-07
  • 2015-08-14
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
相关资源
最近更新 更多