名称重整示例的问题

Issues with Name Mangling Example

我有一段时间没有在 Python 中完成 OOP,所以我正在快速回顾一些我忘记如何使用的功能。当我到达 Python 教程 (https://docs.python.org/3/tutorial/classes.html#private-variables-and-class-local-references) 中的名称重整时,我复制了该示例以便尝试使用它,但它没有用!我又检查了一遍以确保我没有输入任何拼写错误,然后复制并粘贴它,但它告诉我我传递了错误数量的参数。我要么犯了一个非常愚蠢的错误,要么发生了一些奇怪的事情。有谁知道为什么会这样?我使用的是最新版本:3.6.5.

为了验证我输入的所有内容是否正确,这是我尝试命名 mangle 的尝试:

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

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

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

你真的在打电话:

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

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

由于您将 init 定义为仅接受两个参数,self 和 iterable,并且您提供了三个参数,因此您会收到一个错误。