【问题标题】:Python 3 Strategy / Factory Pattern: Type for instance of class that dynamically inherits implementations of one or more abstract class typesPython 3 策略/工厂模式:动态继承一种或多种抽象类类型实现的类实例类型
【发布时间】:2019-02-01 13:56:27
【问题描述】:

我正在编写以下类结构:

class genericCar(ABC):
      baseCarMethodA()

class specificCar(genericCar):
      specificCarMethodB()

class genericEngine(ABC):
      baseEngineMethodA()

class specificEngine(genericEngine):
      specificEngineMethodA()

我想创建一个从许多不同类(如 specificCar 和 specificEngine 等)动态继承的容器对象,以构造一个包含它们的方法和字段的对象。

我通过选择对象应该通过字符串名称继承的通用类类型的实现来做到这一点:

def getBuiltCar(genericCar, genericEngine):
    class carFactory(genericCar, genericEngine):
        def __init__(self):
            pass
    return builtCar

这个想法是构建一个继承自(concreteImplofGenericTypeA、concreteImplofGenericTypeB等)的对象(汽车)。

我想这样做:

def testDynamicInheritance():
    instance = getBuiltCar("specificCar", "specificEngine") 
    # Type of object instance is a union of specificCar + specificEngine
    # but how do I use Type methods to label instance with the proper type?
    instance.<autoSuggests>specificEngineMethodA()
    instance.<autoSuggests>specificCarMethodB()

Pycharm 自动补全应该识别出实例继承自“specificCar”和“specificEngine”。所以这本质上是一个动态的 mixin 工厂。

如何使用 Python 的类型系统为 pycharm 提供正确的类型提示,以正确地自动完成动态继承的具体类中的方法和字段?还是我做错了?

【问题讨论】:

  • 我不想做的是:python-3-patterns-idioms-test.readthedocs.io/en/latest/… 换句话说,为每个可能的组合创建一个具体的工厂,如果我们只从两个类继承这可能会起作用,但是如果我们需要从第三类继承吗?会有一个具体的工厂类爆炸。

标签: python dynamic mixins factory-pattern type-hinting


【解决方案1】:

您可能想要使用更接近builder creation pattern 的东西,或者可能是prototype creation pattern

您将轮胎、车架、引擎等聚合为组件,并将它们作为汽车实例公开,而不是动态多重继承。该汽车实例甚至不一定需要子类型。

【讨论】:

  • 我会尝试使用其中一种模式来构建它,我会让你知道结果。我认为我真正苦苦挣扎的是让 IDE 认识到我正在构建的对象是由具有某些方法的这些其他对象组成的,并试图让它用这些方法呈现一个自动完成列表。但这不是语言问题,而是 IDE / 打字问题。这里的答案对mixin有一些很好的使用,也许我会尝试一下,看看它在编辑器(pycharm)中是如何工作的:stackoverflow.com/questions/533631/…
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 2013-06-10
  • 2018-07-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多