Использование атрибутов из производного класса в базовом классе - PullRequest
1 голос
/ 16 октября 2019

В проекте, над которым я работаю, у нас есть иерархия классов, каждый класс которой определяет метод get_text().

class Base:
    def get_text(self):
        raise NotImplementedError

class Derived1(Base):
    def get_text(self):
        return "Text from Derived1"

class Derived2(Base):
    def get_text(self):
        return "Text from Derived2"

obj1 = Derived1()
print(obj1.get_text())
==> 'Text from Derived1'

obj2 = Derived2()
print(obj2.get_text())
==> 'Text from Derived2'

Таким образом, программист может вызвать obj.get_text() и получитьтекст из класса obj указывает на

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

class Base:
    def get_text(self):
        """
        Keep backward compatibility.
        """
        return TEXT  # What should be here?

class Derived1(Base):
    TEXT = "Text from Derived1"

class Derived2(Base):
    TEXT = "Text from Derived2"

obj1 = Derived1()
print(obj1.TEXT)

# Non-refactored code
obj2 = Derived2()
print(obj2.get_text())
==> NameError: name 'TEXT' is not defined

Исходя из C ++, я привык иметь указатель на базовый класс, вызывать метод из производного класса с помощью диспетчеризации виртуальных методов C ++,Возможно ли что-то подобное в Python?

1 Ответ

1 голос
/ 16 октября 2019

Чтобы ответить на мой собственный вопрос (спасибо комментаторам!), Работают оба следующих способа:

return self.__class__.TEXT

Здесь self.__class__ указывает либо на Derived1, либо на Derived2 объекты класса, которые имеютдоступ к TEXT.

return self.TEXT

делает этот шаг на один шаг короче, поскольку алгоритм разрешения атрибутов автоматически обращается к атрибутам класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...