当前位置: 首页 > 面试题库 >

是否不会自动调用Mixin类__init__函数?

方波娃
2023-03-14
问题内容

我想使用Mixin始终向子类添加一些初始化功能,每个子类都继承自不同的API基类。具体来说,我想制作多个不同的子类,这些子类继承自这些API提供的不同基类之一和一个Mixin,后者始终将以相同的方式执行Mixin初始化代码,而无需代码复制。但是,除非我在Child类的__init__函数中显式调用它,否则似乎永远不会调用Mixin类的__init__函数,这不理想。我建立了一个简单的测试用例:

class APIBaseClassOne(object):
    def __init__(self, *args, **kwargs):
        print (" base ")

class SomeMixin(object):
    def __init__(self, *args, **kwargs):
        print (" mixin before ")
        super(SomeMixin, self).__init__(*args, **kwargs)
        print (" mixin after ")

class MyClass(APIBaseClassOne):
    pass

class MixedClass(MyClass, SomeMixin):
    pass

如下面的输出所示,从不调用Mixin函数的init:

>>> import test
>>> test.MixedClass()
 base
<test.MixedClass object at 0x1004cc850>

有没有办法做到这一点(在Mixin中有一个init函数被调用)而无需编写每个子类来显式调用Mixin的init函数?(即,不必在每个班级都这样做:)

class MixedClass(MyClass, SomeMixin):
    def __init__(*args, **kwargs):
        SomeMixin.__init__(self, *args, **kwargs)
        MyClass.__init__(self, *args, **kwargs)

顺便说一句,如果我所有的子类都继承自相同的基类,我意识到我可以创建一个新的中类,该中类继承自基类和mixin并保持DRY的状态。但是,它们从具有通用功能的不同基类继承。(准确地说是Django
Field类)。


问题答案:

抱歉,我这么晚才看到,但是

class MixedClass2(SomeMixin, MyClass):
    pass

>>> m = MixedClass2()
 mixin before 
 base 
 mixin after

@Ignacio谈论的模式称为合作多重继承,这很棒。但是,如果基类对合作不感兴趣,则将其作为第二个基础,而将其混入第一个。在__init__()Python的MRO之后,将在基类之前检查mixin
(及其定义的其他内容)。

尽管我不确定它能处理您的特定用途,但这应该可以解决一般性问题。具有自定义元类(例如Django模型)或奇怪的装饰器(例如@ martineau’s
answer;)的基类可以做疯狂的事情。



 类似资料:
  • 如果被装箱的值是和之间的类型的整数文字(§3.10.1),或者是或(§3.10.3),或者是和之间的字符文字(§3.10.4),则让和是任意两次装箱转换的结果。情况总是。 描述行为的 <罢工> 一模一样 与相似*。但似乎并不能保证确实被调用,这意味着理论上可能有一个实现为自动装箱的值保留一个单独的专用缓存。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间的标识可能不相等。 Oracle的“自动

  • 我正在寻找一些可以让我像Mongoid那样做的事情: 基本上,包含一个模块并使用其中声明的方法。但是我得到以下错误: 这是模块代码: 下面是课程代码: 我的ruby版本是2.1.2 编辑: 我在模块中使用了这个,它工作得很好:

  • 问题内容: 我正在用Python编程,我想知道是否可以测试代码中是否已调用函数 我该怎么做? 问题答案: 如果该函数知道其自己的名称是可以的,则可以使用function属性: 您还可以使用装饰器设置属性:

  • 问题内容: 如果返回错误,是否仍在调用? 问题答案: 不,延迟功能不会运行。 这是log.Fatal的描述: 致命等同于Print(),然后调用os.Exit(1)。 呼叫,其描述在这里: 退出使当前程序以给定的状态码退出。按照惯例,代码零表示成功,代码零表示错误。程序立即终止;延迟功能未运行。 示范 如果您确实需要在程序完成之前正确关闭资源或执行某些任务,请不要使用。

  • 问题内容: 我有一个看起来像的文件夹结构: : : : : : : 当我直接使用该模块时,它似乎按预期工作: 但是,当我在sphinx中使用自动模块时(将项目文件夹添加到sys.path之后): 我得到的页面只有: 似乎正在忽略类型语句。 但是,如果我将所有代码直接复制到每个模块/子模块的文件中,则会得到: sphinx是否不适用于文件中具有此类导入语句的模块,还是我遗漏了一个更明显的问题? 理想

  • 问题内容: 我有一个带有几个初始化变量的python类: 有没有一种方法可以在PyCharm中自动创建此代码,因此我不必显式键入: 这种模式在我的代码中经常发生。有没有更好的(Pythonic)方法来初始化类? 我已经看过这篇文章(用Python进行自动属性分配的最佳方法是什么,这是个好主意吗?),但是我不想使用装饰器,因为它会使代码的可读性降低。 问题答案: 您可以从制作自定义实时模板开始。我不