Python - 将添加的基础 class 功能传播到子 classes
Python - Propagating added base class functionalty to subclasses
假设我正在使用具有以下 classes:
的形状绘制框架
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()
是一种 class 方法,我不知道这个解决方案是否可靠。
基本上,我想扩展 Shape
并在 Rect
class 中提供该扩展方法,而无需重新定义 Rect
。有pythonic解决方案吗?
如果有人能告诉我它的技术名称,加分加分,因为我不知道 Google 是什么术语。谢谢!
您可以将其附加到 ABC:
Shape.fill = _shapefill
如果你想更好地使用 IDE 和代码分析,你可以在 mixin class 中定义你的额外方法,你从自定义形状 classes:
class ShapeMixin:
def fill(self):
pass
class MyRect(Rect, ShapeMixin):
pass
这基本上是您的第一个解决方案,但表达得更清楚一些。
假设我正在使用具有以下 classes:
的形状绘制框架 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()
是一种 class 方法,我不知道这个解决方案是否可靠。
基本上,我想扩展 Shape
并在 Rect
class 中提供该扩展方法,而无需重新定义 Rect
。有pythonic解决方案吗?
如果有人能告诉我它的技术名称,加分加分,因为我不知道 Google 是什么术语。谢谢!
您可以将其附加到 ABC:
Shape.fill = _shapefill
如果你想更好地使用 IDE 和代码分析,你可以在 mixin class 中定义你的额外方法,你从自定义形状 classes:
class ShapeMixin:
def fill(self):
pass
class MyRect(Rect, ShapeMixin):
pass
这基本上是您的第一个解决方案,但表达得更清楚一些。