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_session
和 sqlalchemy_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'
如果我的意图是为每个实例创建一个单独的会话,我不确定应该做什么,我无法找到有关如何实例化工厂对象的相关文档。
我有许多如下所示的工厂对象:
class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Operator
sqlalchemy_session = Session()
sqlalchemy_session_persistence = 'commit'
operator = 'equals'
它们都共享相同的 Meta
内部 class 并且具有不同的模型,但它们也共享那些 sqlalchemy_session
和 sqlalchemy_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 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.
的元数据 classdef 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'
如果我的意图是为每个实例创建一个单独的会话,我不确定应该做什么,我无法找到有关如何实例化工厂对象的相关文档。