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
对象?当尚不存在任何其他 Node
s 时,第一个存在的 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 函数将自己的类的实例作为默认参数的主要内容,如果未能解决你的问题,请参考以下文章