LINUX.ORG.RU

Про полиморфизм

 ,


1

1

Есть два класса:

class BaseClass(object):
    def __init__(self):
        self.func = self.__method

    def __method(self):
        print 1

    def execute(self):
        self.func()


class AdvancedClass(BaseClass):
    def __method(self):
        print 2

естественно, код

o = AdvancedClass()
o.execute()

выдаёт 1, по моей логике хочется получить здесь 2.

Возможно организовать такое, переопределяя в потомке только __method, не трогая другую логику родителя?

★★★★★
Ответ на: комментарий от tailgunner

Ага, сообразил, что это не совсем нормальное желание, перечитал документацию: __Foo автоматически изменяется на __Classname__Foo и переопределение __Foo невозможно.

vvn_black ★★★★★
() автор топика
Ответ на: комментарий от vvn_black

Возможно через self.__dict__, но это извращение (использовать такие имена).

AIv ★★★★★
()
Ответ на: комментарий от vvn_black

всё возможно, нужно руками _BaseClass__method заменить на _AdvancedClass__method в объекте класса AdvancedClass. Но лучше так не делать, разве что в виде единичного хака/костыля.

Собственно, в AdvancedClass() после определения __method() нужно добавить

...
    _BaseClass__method = __method
mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 2)

Если BaseClass твой, то у тебя должна быть очень серьезная причина для двух андерскоров. В противном случае можешь высказать афтару свое фи и пожелать ему скорейшей смерти.

anonymous
()

Такие фичи уже как-то не по питоньему. Не используй подчеркивания.

Siado ★★★★★
()
Ответ на: комментарий от vvn_black

можно ещё проще, вместо имени __method заюзать сразу _BaseClass__method в классе AdvancedClass()

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.