Python 为什么这个错误会说I';我给函数两个参数?
我定义了一个graph类,它有一个函数,用于获取节点名称并将名称和节点添加到字典中。当我运行程序时,我在底部收到错误。为什么它认为我给了它两个论点Python 为什么这个错误会说I';我给函数两个参数?,python,Python,我定义了一个graph类,它有一个函数,用于获取节点名称并将名称和节点添加到字典中。当我运行程序时,我在底部收到错误。为什么它认为我给了它两个论点 class Graph: def __init__(self): self.node_list = {} self.number = 0 def node(node_name): if node_name in self.node_list.keys: ret
class Graph:
def __init__(self):
self.node_list = {}
self.number = 0
def node(node_name):
if node_name in self.node_list.keys:
return node_list[node_name]
else:
node_list[node_name] = Node()
...
def PrefixTrieConstruction(patterns):
trie = Graph()
trie.node('root')
for pattern in patterns:
currentNode = trie.node('root')
for symbol in pattern:
for daughter in currentNode.daughters:
if daughter.label == symbol:
currentNode = daughter
break
else:
node_name = Trie.name_node()
Trie.node(node_name)
Trie.edge(currentNode, node_name, symbol)
currentNode = node_name
return Trie
Traceback (most recent call last):
File "PythonProject2.3.py", line 168, in <module>
main()
File "PythonProject2.3.py", line 163, in main
TrieMatching(text, PrefixTrieConstruction(patterns))
File "PythonProject2.3.py", line 68, in PrefixTrieConstruction
trie.node('root')
TypeError: node() takes 1 positional argument but 2 were given
类图:
定义初始化(自):
self.node_list={}
self.number=0
def节点(节点名称):
如果self.node_list.keys中的node_name:
返回节点列表[节点名称]
其他:
节点列表[节点名称]=节点()
...
def Prefixtrie构造(模式):
trie=图()
trie.node('根')
对于模式中的模式:
currentNode=trie.node('根')
对于图案中的符号:
对于currentNode.children中的子节点:
如果子元素.label==符号:
currentNode=子节点
打破
其他:
node\u name=Trie.name\u node()
Trie.node(节点名称)
Trie.edge(当前节点、节点名称、符号)
currentNode=节点名称
返回Trie
回溯(最近一次呼叫最后一次):
文件“PythonProject2.3.py”,第168行,在
main()
文件“PythonProject2.3.py”,第163行,在main中
TrieMatching(文本、前缀和构造(模式))
文件“PythonProject2.3.py”,第68行,在PrefixTrieConstruction中
trie.node('根')
TypeError:node()接受1个位置参数,但提供了2个
您缺少了self
:
def node(self,node_name):
self
指的是您正在调用方法的实例,因此您已经在传递该实例,因此传递'root'
显然会给您带来所看到的错误
trie.node('root')
基本上是在做Graph.node(trie,“root”)
所以你将两个参数传递给一个取一个参数的方法,方法中的节点名称被解释为实例,所以'root'
是一个额外的参数,除非您使用的是静态方法或类方法,否则方法的第一个参数应该始终是self
,它可以是任何名称,但根据惯例,几乎每个python程序员都使用self
引用实例
这很简单!
函数节点
仅接受一个参数,但位于类中。给定隐式类实例和参数,这是两个参数。要修复此问题,可以将函数编辑为
def node(self,node_name):
在python中,方法的第一个参数始终是调用该方法的对象。这个变量按惯例称为self
,但没有规定必须如此。所以当你写作时:
def node(node_name):
trie.node('root')
node_name
被解释为“self”变量,函数的预期用途为:
trie.node() #within this call, trie is bound to node_name
所以当你写作时:
def node(node_name):
trie.node('root')
trie
绑定到node\u name
,而的“root”
是一个额外的参数,会导致错误
要获得预期的行为,只需声明self
变量:
def node(self, node_name):
好的,所以所有类方法都必须有“self”,但init不需要?@jukhamil,这取决于,静态方法不需要self,但在基本层面上,您应该始终使用self,init也需要self。我添加了一些与不同类型的方法相关的链接,这是一个评论无法涵盖的广泛主题。先生,救了我一天!