我试图从子类B中的父类A调用__search,但出现错误:

AttributeError: 'B' object has no attribute '_B__search'

这似乎只发生在以__开头的方法中.在进行继承时,有没有方法调用这些类私有方法?

class A:
    def __init__(self, a):
        self.a = a
        
    def __search(self):        
        return self.a

    def display(self):
        print(self.a)

class B(A):
    def display(self):
        res = self.__search()
        return res

cB = B(2)

cB.display()

推荐答案

是的,但这是一种可怕的做法.

在Python中,名称以__开头而不是以__结尾的方法(因此不包括像__add__这样的神奇方法)会与类名混淆.也就是说,

class A:
  def __foo(self):
    return 1

相当于

class A:
  def _A__foo(self):
    return 1

所以,如果你想调用A上定义的__search,你应该写

res = self._A__search()

同样,这是一种糟糕的做法.以__开头的方法是模糊的because,这是Python对私有函数的约定,因此可以从类外或子类中调用它们.您在 comments 中提到,这是一个临时修复,因此这是可以理解的,但我确实希望它不会以这种方式保持很长时间.

Python相关问答推荐

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

运行Python脚本时,用作命令行参数的SON文本

如果值不存在,列表理解返回列表

如何制作10,000年及以后的日期时间对象?

在Python中管理打开对话框

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

Python+线程\TrocessPoolExecutor

索引到 torch 张量,沿轴具有可变长度索引

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

ConversationalRetrivalChain引发键错误

Polars map_使用多处理对UDF进行批处理

统计numpy. ndarray中的项目列表出现次数的最快方法

语法错误:文档. evaluate:表达式不是合法表达式

需要帮助使用Python中的Google的People API更新联系人的多个字段'

Python协议不兼容警告

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

如何在polars group_by中将多个行分组到列表中