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

是否不会自动调用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是否不适用于文件中具有此类导入语句的模块,还是我遗漏了一个更明显的问题? 理想

  • 问题内容: 我想运行以下查询: 以下查询(来自主查询的子查询): 在7秒内执行,从210万行的表中产生了2691行。 我在上面触发了 主查询 ,并且在等待5分钟以上之后它仍在执行。 最后,我分别执行了子查询,从结果中提取了2691条记录,执行了以下查询: 令人惊讶的是,这在40秒内给了我一个答案。 是什么赋予了?为什么MySQL不使用我使用的相同技术并迅速给出答案?难道我做错了什么? 问题答案: