Python 教程中的名称修改示例

问题描述

请参阅第 9.6 Private Variables 节,其中给出了 Python 的 __name mangling 功能的示例:

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)

即使 MappingSubclass 引入 __update 标识符,上面的例子也能工作,因为它在 _Mapping__update 类中被 Mapping 和 {{1 }} 分别在 _MappingSubclass__update 类中。

我理解这是如何工作的:当 MappingSubclass 类使用 Mapping 时,它调用自己的 self.__update(iterable) 定义并明确选择退出调用任何子类方法。如果没有这种间接性,子类重定义会导致 update 方法损坏,引发:

__init__

我不明白的是为什么会以这种晦涩的方式来完成,而做同样事情的更清晰和直接的方式是:

TypeError: update() missing 1 required positional argument: 'values'

重整的命名空间行为似乎使语言复杂化,特别是在 cpython 的字节编译中,那么是否有更好的解释来解释为什么它是一个必要的特性?我正在寻找一个可以使用名称修改实现的示例,或者解释为什么文档中的人为示例实际上确实需要修改并且可以'不要像描述的那样更简单地编写,完全不需要将令人困惑的“私有变量”功能作为语言的一部分。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...