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类上;看我编辑过的答案。我想这就是我想要的。谢谢我不确定多重继承是否能很好地配合这个设置,但看起来它在这里工作得很好。