gpt4 book ai didi

python - 使用 ABC、PolymorphicModel、django-models 给出元类冲突

转载 作者:太空狗 更新时间:2023-10-30 00:12:55 25 4
gpt4 key购买 nike

到目前为止,关于 SO 的所有其他答案都以完全相同的方式回答:构造您的元类,然后继承这些元类的“加入”版本,即

class M_A(type): pass
class M_B(type): pass
class A(metaclass=M_A): pass
class B(metaclass=M_B): pass

class M_C(M_A, M_B): pass
class C:(A, B, metaclass=M_C): pass

但我不知道这些人生活在什么世界里,他们在那里构建自己的元类!显然,人们会使用其他库中的类,除非您完美掌握元编程,否则您怎么知道是否可以覆盖类的元类? (显然我还没有掌握它们)。

我的问题是:

class InterfaceToTransactions(ABC):
def account(self):
return None
...

class Category(PolymorphicModel, InterfaceToTransactions):
def account(self):
return self.source_account
...

class Income(TimeStampedModel, InterfaceToTransactions):
def account(self):
return self.destination_account
...

这当然给了我错误:“元类冲突:派生类的元类必须是其所有基元类的(非严格)子类”我已经尝试了上面给出的解决方案的多种变体,下面的不起作用,给出了同样的错误。

class InterfaceToTransactionsIntermediaryMeta(type(PolymorphicModel), type(InterfaceToTransactions)):
pass

class Category(PolymorphicModel, InterfaceToTransactions):
__metaclass__ = InterfaceToTransactionsIntermediaryMeta
...

也不会在 Meta 类函数中放置任何东西。我已经阅读了关于该主题的所有其他 SO 问题,请不要简单地将其标记为重复。

--------------------接受解决方案后于 1/8/18 编辑------

奇怪的是,如果我尝试使用这个新配置(我接受的配置)进行迁移,它会再次开始给出元类错误,但它在运行时仍然有效。如果我注释掉元类部分,然后 makemigrations 和 migrate,它会成功完成,但每次迁移后我都必须把它放回那里。

最佳答案

如果您使用的是 Python 3,那么您正在尝试错误地使用您的派生元类。

并且由于您得到“相同的错误”,而不是其他可能的、更微妙的错误,所以我会说这就是正在发生的事情。

试着改成:

class IntermediaryMeta(type(InterfaceToTransactions), type(PolymorphicModel)):
pass

class Category(PolymorphicModel, InterfaceToTransactions, metaclass=IntermediaryMeta):
...

(至少 ABCMeta 类可以保证使用 super 协同工作,这足以让我们将它放在最前面的基础上)元组)

如果这给您带来了新的和改进的错误,这意味着由于多种动机之一,这些类中的一个或两个不能真正正确地协作。然后,要走的路是强制依赖于 ABCMeta 的继承树不这样做,因为它的作用在一种语言中几乎是美学的,而其他一切都是为了像 Python 这样的“同意的成年人”。

不幸的是,实现这一目标的方法是使用各种暴力方法,从安全的“重写所有内容”到猴子修补 ABCMeta 和抽象方法在“InterfaceToTransactions”被定义为什么都不做的地方。

如果您需要到达那里并需要一些帮助,请发布另一个问题。

抱歉 - 这实际上是使用元类的主要缺点。

关于python - 使用 ABC、PolymorphicModel、django-models 给出元类冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com