【问题标题】:Calling a method from a parent class in Python在 Python 中从父类调用方法
【发布时间】:2013-07-16 13:15:12
【问题描述】:

谁能帮我用正确的语法从父类调用我的方法__get_except_lines(...)

我有一个类,其方法如下所示。这个特殊的方法有两个下划线,因为我不希望“用户”使用它。

NewPdb(object)
    myvar = ...
    ...
    def __init__(self):
        ...
    def __get_except_lines(self,...):
        ...

在一个单独的文件中,我有另一个继承自该类的类。

from new_pdb import NewPdb

    PdbLig(NewPdb):
        def __init__(self):
            ....
            self.cont = NewPdb.myvar
            self.cont2 = NewPdb.__get_except_lines(...)

我得到一个让我很困惑的属性错误:

AttributeError: type object 'NewPdb' has no attribute '_PdbLig__get_except_lines'

【问题讨论】:

  • 从 NewPdb 导入 __get_except_lines(...) 是否有效?
  • 感谢@hivert,问题现已解决。我真的很感谢大家在这里的帮助,我又学到了一些新东西(名字修饰)!很棒的社区!

标签: python class inheritance methods attributeerror


【解决方案1】:

您的问题是由于私有变量 (http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references) 的 Python 名称修改所致。你应该写:

NewPdb._NewPdb__get_except_lines(...)

【讨论】:

    【解决方案2】:
    super(<your_class_name>, self).<method_name>(args)
    

    例如

    super(PdbLig, self).__get_except_lines(...)
    

    【讨论】:

    • 谢谢,但现在我收到了AttributeError: 'super' object has no attribute '_PdbLig__get_except_lines'。我用self.cont = super(NewPdb,self).__get_except_lines(...
    • 这是因为双下划线导致name mangling。如果您想让变量保持可访问性,同时赋予其内部含义,请添加一个下划线 - 这通常称为 internally-used 指示符。
    【解决方案3】:

    在名称前加上双下划线的全部目的是为了防止它在子类中被调用。见http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

    如果你想这样做,那么不要用双下划线命名它(你可以使用单下划线),或者在基类上为名称创建别名(这样又违背了目的)。

    【讨论】:

    • 啊,好吧,现在说得通了。目的是我有一个具有此方法的父类,该方法(该方法)只能由我自己在其他方法中使用。所以我想我能做的就是将此方法复制并粘贴到子类中,尽管它不是“最干净”的方式
    • @SebastianRaschka 或者只是不使用两个下划线。
    • 我想让这两个下划线让“用户”知道这是他不打算使用的方法之一。
    • @SebastianRaschka 这种情况下的约定是使用单个下划线。
    • 谢谢,我真的不知道。在这里找到一个关于单下划线和双下划线用法的好帖子:stackoverflow.com/questions/6930144/…
    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2017-11-09
    相关资源
    最近更新 更多