Python—将添加的基类功能传播到子类

Python—将添加的基类功能传播到子类,python,oop,inheritance,subclass,Python,Oop,Inheritance,Subclass,假设我正在使用具有以下类的形状绘制框架: 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 Hexago

假设我正在使用具有以下类的形状绘制框架:

 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
等,但我希望每个都有一个
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
。有没有一种肾盂疗法


如果有人能告诉我这个的技术名称,我会得到额外的分数,因为我不知道谷歌的术语。谢谢

您只需将其附加到ABC:

Shape.fill = _shapefill
如果您想更好地使用IDE和代码分析,可以在一个mixin类中定义额外的方法,您可以从自定义形状类中继承该类:

class ShapeMixin:
    def fill(self):
        pass

class MyRect(Rect, ShapeMixin):
    pass

这基本上是您的第一个解决方案,但表达得更清晰一些

这被称为“猴子修补”。这比我的第二个解决方案更有效,谢谢。有没有一种好方法可以告诉像PyCharm这样的编辑,
fill
是一种
Shape
方法?目前,自动完成功能无法识别子类。@ntjess我不确定这一点-一般来说,这似乎是一件非常困难的事情。如果您想要更好的完成,可以将其放在继承自的mixin类上;看我编辑过的答案。我想这就是我想要的。谢谢我不确定多重继承是否能很好地配合这个设置,但看起来它在这里工作得很好。