2013-07-17 120 views
2

任何人都可以用正确的语法来帮助我从父类中调用我的方法__get_except_lines(...)吗?在Python中调用父类的方法

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

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' 
+0

是否从NewPdb导入__get_except_lines(...)工作? – debianplebian

+0

现在,由于@hivert,问题已解决。我真的很感谢大家在这里的帮助,我又学到了一些新的东西(名字不断变化)!伟大的社区! – Sebastian

回答

0
super(<your_class_name>, self).<method_name>(args) 

例如

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

谢谢,但现在我得到一个'AttributeError:'super'对象没有属性'_PdbLig__get_except_lines''。我使用'self.cont = super(NewPdb,self).__ get_except_lines(...' – Sebastian

+0

这是因为双下划线导致[name mangling](http://docs.python.org/release/1.5/tut/node67.html )。如果你想保持你的变量可以访问,但给它的内部含义,添加一个下划线 - 这通常被称为“内部使用的”指标 –

0

把双下划线放在名字前的整个观点是为了防止它在子类中被调用。见http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

如果你想这样做,那么不要用双下划线(你可以使用一个下划线)来命名它,或者为基类上的名字创建一个别名(从而再次击败目的) 。

+0

啊,好吧现在有道理。我的意图是,我有这个方法的父类,该方法只能在其他方法中使用,所以我想我可以做的只是将这个方法复制并粘贴到子类中,尽管它不是“最干净”的方式 – Sebastian

+0

@ SebastianRaschka或者只是不使用两个下划线 – Marcin

+0

我想让那些“用户”有2个下划线,以知道这是他不打算使用的方法之一 – Sebastian