工厂男孩工厂的错误继承行为

2024-05-18 10:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个工厂的结构是这样的:

AbstractFactoryMinimal(DjangoModelFactory):
    comment = ''

AbstractFactoryFull(AbstractFactoryMinimal):
    comment = Faker(provider='text', max_nb_chars=2000)

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

FactoryFull(FactoryMinimal, AbstractFactoryFull):
    field = Faker(provider='text', max_nb_chars=2000)

obj = FactoryFull()
print(obj.comment) # expect some text from faker, but got '' instead
print(obj.field)   # works like expected, return some random text

在我的模型里

^{pr2}$

以及

SomeModel(AbstractModel)

我甚至看了一下mro,它看起来和我预期的完全一样:

(FactoryFull,
FactoryMinimal,
AbstractFactoryFull,
AbstractFactoryMinimal,
factory.django.DjangoModelFactory,
factory.base.Factory,
factory.base.BaseFactory,
object)

所以“comment”字段应该由faker生成,而不仅仅是用“”设置。为什么要这样工作?我如何实现工厂以看到预期的行为?在

编辑: 我可以将上一个工厂中的继承顺序更改为:

FactoryFull(AbstractFactoryFull, FactoryMinimal)

它可以工作,但若我想重写FactoryMinimal中的字段,它就不起作用了。有时候我需要这个功能。无论如何,这并不是Python中正常的继承行为。在


Tags: textobjfieldfactory工厂commentprovidermax
2条回答
# Scan the inheritance chain, starting from the furthest point,
# excluding the current class, to retrieve all declarations.
for parent in reversed(self.factory.__mro__[1:]):
    ...

你可以看到上面的原因。同时检查此提交中的测试https://github.com/FactoryBoy/factory_boy/commit/e2ef7c96ed74b35b9dec75a7f222b6ffa9214c10 我不知道为什么会这样。也许可以问问这个图书馆的作者关于动机的问题?在

所以我找到了一些解决办法。在

基本上,我改变继承顺序并重复一些代码。像这样:

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

FactoryFull(AbstractFactoryFull, FactoryMinimal):
    field = Faker(provider='text', max_nb_chars=2000)

    class Meta(object):
        model = SomeModel

如果我需要重写基类中的某些内容,我使用MixIn类来实现:

^{pr2}$

现在只剩下一个问题:我怎么能说谁会维护我的代码,为什么我要在每个工厂这样做。在

相关问题 更多 >