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