Python,Kivy - 如何调试TypeError:object.__init__()只接受一个参数?



我已经使用 Kivy 的EventDispatcherclass 和 mongodb 实现了 DAO

我的代码结构如下:

class Meta(type):
# meta deffinition
@property
def objects():
#returns a db connection instance, for queries

class Model(EventDispatcher, metaclass=Meta)
# model deffinition
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # this is the line that causes my problem

我有很多模型用这种结构定义:

class FooModel(Model):
# foo definition

class BarModel(Model):
# bar deffinition

class PsyModel(FooModel):
# psy deffinition

class XPTOModel(BarModel):
# psy deffinition
...

模型定义仅添加属性、获取者和二传手

隔离的模型设置工作正常,所有预期行为都没问题

但是在尝试实例化模型时,我在堆栈跟踪深处的特定部分中收到以下错误:

File "/path/to/project/models.py", line 83, in __init__
super().__init__(*args, **kwargs)
File "kivy/_event.pyx", line 243, in kivy._event.EventDispatcher.__init__
TypeError: object.__init__() takes exactly one argument (the instance to initialize)

我的代码中的所有模型都使用相同的方法调用实例化,但此错误仅存在于特定的 cenario 中,我很难跟踪问题。 我已经检查了调试工具、对象、类型和 MRO,但它们遵循相同的、所需的结构。

维修:

(<class 'models.PsyModel'>, <class 'models.FooModel'>, <class 'models.Model'>, <class 'kivy._event.EventDispatcher'>, <class 'kivy._event.ObjectWithUid'>, <class 'object'>)
(<class 'models.XPTOModel'>, <class 'models.BarModel'>, <class 'models.Model'>, <class 'kivy._event.EventDispatcher'>, <class 'kivy._event.ObjectWithUid'>, <class 'object'>)

所以我想知道是什么原因造成的?以及如何进一步了解可能发生的事情?

tl;dr:事实证明,我确实在MRO中传递了更多的参数,直到它达到object.__init__,因为我的kwargs的参数与MRO类中的任何kivy属性都不匹配。

所以.. 当使用 kwargs 实例化 Kivy 的小部件或任何EventDispatcher子类时,如下所示:

class MyClass(EventDispatcher):
prop = StringProperty()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
obj = MyClass(prop='will consume', not_a_prop='will not consume')

kivy的属性处理消耗与当前类的kivy属性匹配的kwarg,但只消耗匹配的kwarg,并允许其余的kwarg继续进入MRO中的下一个类,最终达到object

在上面的例子中,当实例化MyClass时,prop将在MyClass.__init__中使用,但由于MRO中没有一个类有一个名为not_a_prop的kivy属性,它将被传递给下一个类的__init__调用,最终达到object.__init__

最新更新