Python 使用factory_boy从父工厂继承参数
我想要一个子工厂来扩展它的父工厂。我认为扩展参数比复制参数更可取。我尝试过让子类中的Python 使用factory_boy从父工厂继承参数,python,factory-boy,Python,Factory Boy,我想要一个子工厂来扩展它的父工厂。我认为扩展参数比复制参数更可取。我尝试过让子类中的Params从父类Params继承,如下所示: import factory class BaseFactory(factory.Factory): class Params: configuration_one = True class MyFactory(BaseFactory): class Params(BaseFactory.Params): con
Params
从父类Params
继承,如下所示:
import factory
class BaseFactory(factory.Factory):
class Params:
configuration_one = True
class MyFactory(BaseFactory):
class Params(BaseFactory.Params):
configuration_two = False
这是失败的,但有一个例外:
AttributeError Traceback (most recent call last)
<ipython-input-5-cc609d2c781d> in <module>()
6 configuration_one = True
7
----> 8 class MyFactory(BaseFactory):
9 class Params(BaseFactory.Params):
10 configuration_two = False
<ipython-input-5-cc609d2c781d> in MyFactory()
7
8 class MyFactory(BaseFactory):
----> 9 class Params(BaseFactory.Params):
10 configuration_two = False
11
AttributeError: type object 'BaseFactory' has no attribute 'Params'
AttributeError回溯(最近一次调用)
在()
6配置1=正确
7.
---->8级MyFactory(基本工厂):
9类参数(BaseFactory.Params):
10配置2=错误
在我的工厂()
7.
8级MyFactory(基本工厂):
---->9类参数(BaseFactory.Params):
10配置2=错误
11
AttributeError:类型对象“BaseFactory”没有属性“Params”
是什么导致了这个错误,有没有一种惯用的方法来实现我的目标
版本
Python
-2.7.12
工厂男孩
-2.9.2我正在朝着同样的目标努力。我想干掉我的工厂,因为我使用的是多态模型
坏消息是factoryboy DSL从属性中删除了Meta和Params类。我不知道他们为什么这样做,可能这简化了他们从父工厂继承前置变量和后置变量的方式?我认为他们试图模仿ruby中的FactoryGirl,但没有能力进行monkey补丁,因为python
这是相关文件
祝你好运
另外,通过将父Param类放在父工厂之外,我取得了一些进展,但它仍然不起作用
import factory
class BaseParam:
foo=True,
bar=False
class MyFactory(factory.Factory):
class Meta:
abstract=False
model=Yolo
class Params(BaseParam):
baz=factory.Trait(
foo=False
)
MyFactory(baz=True)
给我这个
TypeError: 'foo' is an invalid keyword argument for this function
因此,Param显然没有继承任何东西,也没有像普通类那样发挥作用。我找到了一种使用decorator的方法
In [47]: import factory
...:
...:
...: def with_base_params(target_factory):
...: class NewClass(target_factory):
...: class Params:
...: baz=factory.Trait(
...: name="chandeeland",
...: address="123 fake st"
...: )
...: return NewClass
...:
...: @with_base_params
...: class MyFactory(factory.Factory):
...: class Meta:
...: abstract=False
...: model=Contact
...:
...: name = "someone else"
...:
...: a = MyFactory()
...: a.name == "someone else"
...: a.address == None
...:
...: b = MyFactory(name="another name")
...: b.name == "another name"
...: b.address == None
...:
...: c = MyFactory(baz=True)
...: c.name == "chandeeland"
...: c.address == "123 fake st"
...:
Out[47]: True
它并不完美,您无法扩展参数,但它可以