名称重整示例的问题
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,并且您提供了三个参数,因此您会收到一个错误。
我有一段时间没有在 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,并且您提供了三个参数,因此您会收到一个错误。