Вызов метода из родительского класса в Python

Может ли кто-нибудь помочь мне с правильным синтаксисом для вызова моего метода __get_except_lines(...) из родительского класса?

У меня есть класс с методом, как показано ниже. Этот конкретный метод имеет 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'

person Community    schedule 17.07.2013    source источник
comment
Работает ли из NewPdb import __get_except_lines(...)?   -  person debianplebian    schedule 17.07.2013
comment
Теперь проблема решена благодаря @hivert. Я очень ценю помощь каждого здесь, я снова узнал что-то новое (искажение имени)! Отличное сообщество!   -  person    schedule 18.07.2013


Ответы (3)


Ваша проблема связана с искажением имени Python для частной переменной (http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references). Вы должны написать:

NewPdb._NewPdb__get_except_lines(...)
person hivert    schedule 17.07.2013

Весь смысл помещения двойного подчеркивания перед именем состоит в том, чтобы предотвратить его вызов в дочернем классе. См. http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

Если вы хотите сделать это, то не называйте его двойным подчеркиванием (вы можете использовать одиночное подчеркивание) или создавайте псевдоним для имени в базовом классе (таким образом, снова побеждая цель).

person Marcin    schedule 17.07.2013
comment
Ах, хорошо, теперь это имеет смысл. Намерение состояло в том, что у меня есть родительский класс с этим методом, который (метод) должен использоваться только мной в других методах. Итак, я думаю, что я могу просто скопировать и вставить этот метод в дочерний класс, хотя это не самый чистый способ - person ; 18.07.2013
comment
@SebastianRaschka Или просто не используйте два символа подчеркивания. - person Marcin; 18.07.2013
comment
Я хотел, чтобы эти 2 символа подчеркивания были для пользователя, чтобы он знал, что это один из методов, который он не предназначен для использования. - person ; 18.07.2013
comment
@SebastianRaschka В таком случае принято использовать одиночное подчеркивание. - person Marcin; 18.07.2013
comment
Спасибо, я действительно этого не знал. Нашел здесь хорошую ветку об использовании одиночного и двойного подчеркивания: двойное подчеркивание с переменными и методами"> stackoverflow.com/questions/6930144/ - person ; 18.07.2013

person    schedule
comment
Спасибо, но теперь я получаю AttributeError: 'super' object has no attribute '_PdbLig__get_except_lines'. Я использовал self.cont = super(NewPdb,self).__get_except_lines(... - person ; 18.07.2013
comment
Это связано с тем, что двойное подчеркивание вызывает искажение имени. Если вы хотите, чтобы ваша переменная была доступной, но при этом придавала ей внутреннее значение, добавьте одно подчеркивание — обычно это называется индикатором internally-used. - person Maciej Gol; 18.07.2013