问题描述
请参阅第 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 (将#修改为@)