Python 类 的行为嵌套了 类

Python behavior of classes that have nested classes

我有许多如下所示的工厂对象:

class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
    class Meta:
        model = Operator
        sqlalchemy_session = Session()
        sqlalchemy_session_persistence = 'commit'

    operator = 'equals'

它们都共享相同的 Meta 内部 class 并且具有不同的模型,但它们也共享那些 sqlalchemy_sessionsqlalchemy_session_persistence 行。

我的问题是,是否有可能以更 DRY(不要重复自己)的方式编写此对象,这样我就不必经常包含行 sqlalchemy_session = Session()sqlalchemy_session_persistence = 'commit'

到目前为止,我至少有十几家工厂,而且越来越重复。

与其将 Meta 作为 inner-class,不如将其设为基础 class,然后让工厂继承它。正如您所说,它们具有不同的模型,您可以简单地为 __init__ 提供一个参数。以下面的例子:

class Meta:
    def __init__(self, Operator):
        model = Operator
        sqlalchemy_session = Session()
        sqlalchemy_session_persistence = 'commit'

class Factory1(Meta, factory.alchemy.SQLAlchemyModelFactory):
    def __init__(self):
        op = 'equals'
        super.__init__(op)

class Factory2(Meta, factory.alchemy.SQLAlchemyModelFactory):
    def __init__(self):
        op = 'lessthan'
        super.__init__(op)

我不是 100% 确定您想共享哪些会话,the only documentation 我可以找到有关在所有工厂之间共享会话的讨论,但您正在为每个工厂生成一个单独的会话 class 但不是每个实例都如此。 (它是一个 class 变量,因此它在所有实例之间共享)

假设这是一个疏忽,并且您实际上想要所有 Meta 字段的单个会话,您将为 Meta class:

创建一个基础 class
class BaseMeta:
    # now this sessions is shared between ALL factories
    sqlalchemy_session = Session()
    sqlalchemy_session_persistence = 'commit'

class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
    class Meta(BaseMeta):
        model = Operator

    operator = 'equals'

或者,如果您希望每个 class 都有自己的会话,那么您可能需要一个工厂函数用于工厂 class.

的元数据 class
def generate_meta_options(model_):
    class Meta:
        model = model_
        sqlalchemy_session = Session()
        sqlalchemy_session_persistence = 'commit'
    return Meta

class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
    Meta = generate_meta_options(Operator)
    operator = 'equals'

如果我的意图是为每个实例创建一个单独的会话,我不确定应该做什么,我无法找到有关如何实例化工厂对象的相关文档。