名称管理示例的问题

时间:2018-04-07 01:29:48

标签: python python-3.x name-mangling

我还没有在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

1 个答案:

答案 0 :(得分:1)

因此,类中的每个函数都将self作为第一个参数。此参数将自动填充为对象实例的引用。当你打电话

foo = MappingSubclass(['a'], ['b'])

你真的在呼唤:

__init__(foo, ['a'], ['b'])

self不是您在调用类函数时填写的参数,它存储为对您所引用的类的实例的引用

由于你定义init只接受两个参数,self和iterable,并且你提供了三个参数,你会收到一个错误。