我定义了一个图表类,它具有获取节点名称并将名称和节点添加到字典的功能。当我运行程序时,我在底部收到错误。为什么它认为我给它两个论点?
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
答案 0 :(得分:4)
您遗失self
:
def node(self,node_name):
self
指的是您正在调用方法的实例,因此您已经传递了实例,因此传递'root'
显然会给出您看到的错误。
trie.node('root')
基本上正在执行Graph.node(trie,"root")
,因此您将两个args传递给一个方法,该方法需要一个,方法中的node_name
被解释为实例'root'
是一个额外的参数,除非你使用静态或类方法,你的方法的第一个arg应该始终是self
,它可以是任何名称,但几乎每个python程序员按惯例使用self
来引用实例
difference-between-class-and-instance-methods
what-is-the-difference-between-staticmethod-and-classmethod-in-python
答案 1 :(得分:2)
这很简单!
函数node
只接受一个参数,但位于一个类中。给定隐式类实例和您的参数,这是2个参数。要解决此问题,您可以将功能编辑为
def node(self,node_name):
答案 2 :(得分:1)
在python中,方法的第一个参数始终是调用方法的对象。按惯例,此变量称为self
,但没有规则说这必须是这种情况。所以当你写:
def node(node_name):
node_name
被解释为“自”变量,函数的预期用法是:
trie.node() #within this call, trie is bound to node_name
所以当你写:
trie.node('root')
trie
绑定到node_name
,'root'
是一个额外的参数,导致错误。
要获得预期的行为,只需声明self
变量:
def node(self, node_name):