Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 名称损坏示例的问题_Python_Python 3.x_Name Mangling - Fatal编程技术网

Python 名称损坏示例的问题

Python 名称损坏示例的问题,python,python-3.x,name-mangling,Python,Python 3.x,Name Mangling,我已经有一段时间没有用Python进行OOP了,所以我快速回顾了一些我已经忘记如何使用的特性。当我在Python教程()中看到name mangling时,我复制了这个示例以便可以使用它,但它不起作用!我又检查了一遍,确保没有输入任何拼写错误,然后复制并粘贴了它,但它告诉我我传递了错误数量的参数。我不是犯了一个极其愚蠢的错误,就是发生了一些奇怪的事情。有人知道为什么会这样吗?我使用的是最新版本:3.6.5 为了验证我输入的所有内容是否正确,我尝试命名mangle: class Mapping:

我已经有一段时间没有用Python进行OOP了,所以我快速回顾了一些我已经忘记如何使用的特性。当我在Python教程()中看到name mangling时,我复制了这个示例以便可以使用它,但它不起作用!我又检查了一遍,确保没有输入任何拼写错误,然后复制并粘贴了它,但它告诉我我传递了错误数量的参数。我不是犯了一个极其愚蠢的错误,就是发生了一些奇怪的事情。有人知道为什么会这样吗?我使用的是最新版本: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
回溯(最近一次呼叫最后一次):
文件“C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py”,第24行,在
main()
文件“C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py”,第21行,在main中
foo=MappingSubclass(['a'],['b'])
TypeError:\uuuu init\uuuuuu()接受2个位置参数,但给出了3个

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

foo = MappingSubclass(['a'], ['b'])
你真的在打电话:

__init__(foo, ['a'], ['b'])
self不是在调用类函数时填写的参数,它存储为对所引用类实例的引用


因为您将init定义为只接受两个参数,self和iterable,并且提供了三个参数,所以您会得到一个错误

正如在本教程的相关章节中所说的,名称篡改应该允许我在
MappingSubclass
中使用不同的签名声明
update
。问题不是你的定义。问题是您输入了太多的额外参数。将['a'],['b']与['a',b']切换,您的代码将运行良好非常简单地说,您只允许使用一个参数构造MappingSubclass,但您将其设置为两个参数。我知道我现在做错了什么。在初始化
foo
之后,我可以使用
foo.update
中定义的
MappingSubclass
,但是
Mapping.\uuuuu init\uuuuu
调用原始
update
的事实没有改变。这让我发疯了,所以谢谢你。很高兴帮忙:)