Python 为什么这个错误会说I';我给函数两个参数?

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

我定义了一个graph类,它有一个函数,用于获取节点名称并将名称和节点添加到字典中。当我运行程序时,我在底部收到错误。为什么它认为我给了它两个论点

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。我添加了一些与不同类型的方法相关的链接,这是一个评论无法涵盖的广泛主题。先生,救了我一天!