我还没有在Python中完成OOP一段时间,所以我正在快速回顾一些我忘记如何使用的功能。当我在Python教程(https://docs.python.org/3/tutorial/classes.html#private-variables-and-class-local-references)中找到名称错误时,我复制了这个例子,所以我可以玩它,它没有用!我再次查看它以确保我没有输入任何拼写错误,然后复制并粘贴它,但它告诉我我传递了错误的参数。我要么犯了一个令人难以置信的愚蠢错误,要么发生了奇怪的事情。有谁知道为什么会这样?我使用的是最新版本:3.6.5。
这样你就可以确认我输入的所有内容都正确无误,这是我尝试命名的错误:
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # private copy of original update() method
class MappingSubclass(Mapping):
def update(self, keys, values):
# provides new signature for update()
# but does not break __init__()
for item in zip(keys, values):
self.items_list.append(item)
def main():
foo = MappingSubclass(['a'], ['b'])
if __name__ == "__main__":
main()
这是引发的例外:
Traceback (most recent call last):
File "C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py", line 24, in <module>
main()
File "C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py", line 21, in main
foo = MappingSubclass(['a'], ['b'])
TypeError: __init__() takes 2 positional arguments but 3 were given
答案 0 :(得分:1)
因此,类中的每个函数都将self作为第一个参数。此参数将自动填充为对象实例的引用。当你打电话
foo = MappingSubclass(['a'], ['b'])
你真的在呼唤:
__init__(foo, ['a'], ['b'])
self不是您在调用类函数时填写的参数,它存储为对您所引用的类的实例的引用
由于你定义init只接受两个参数,self和iterable,并且你提供了三个参数,你会收到一个错误。