Python - распространение функциональности базового класса на подклассы - PullRequest
0 голосов
/ 20 февраля 2020

Скажем, я использую каркас рисования фигур со следующими классами:

 class Shape(ABC):
  movable: False

  @abstractmethod
  def movePoint(pointId, newX, newY): pass

class Rect(Shape):
  aspectLocked: False

  # Implement abstract function
  def movePoint(pointId, newX, newY): pass

class Hexagon(Shape): pass
  # ...

Я хочу использовать Rect, Hexagon и др. c. в моем коде, но я хочу, чтобы у каждого был метод fill(). Тем не менее, fill() может работать на уровне Shape, поэтому я в конечном итоге сделаю следующее:

def _shapeFill(self):
  pass

class MyRect(Rect):
  def fill(self):
    return _shapeFill(self)

# Same procedure for Hexagon, etc.

Я также могу сделать

for shape in [Rect, Hexagon]:
  shape.fill = _shapeFill

Но такие редакторы, как PyCharm, не распознаю fill() как метод класса, и я не знаю, является ли это решение надежным.

По сути, я хочу расширить Shape И сделать этот расширенный метод доступным в классе Rect без необходимости переопределить Rect. Есть ли решение Pythoni c?

Бонусные баллы, если кто-то может сказать мне техническое имя для этого, так как я не знал, какой термин для Google. Спасибо!

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете просто прикрепить его к AB C:

Shape.fill = _shapefill

Если вы хотите более хорошо играть с IDE и анализом кода, вы можете определить свои дополнительные методы в классе mixin, который вы унаследуете из пользовательских классов фигур:

class ShapeMixin:
    def fill(self):
        pass

class MyRect(Rect, ShapeMixin):
    pass

Это в основном ваше первое решение, но оно выражено немного более четко.

...