超级可以处理多重继承吗?

发布于 2021-01-29 17:18:13

从这样的两个对象继承时

class Foo(object):
  def __init__(self,a):
    self.a=a

class Bar(object):
  def __init__(self,b):
    self.b=b

我通常会做这样的事情

class FooBar(Foo,Bar):
  def __init__(self,a,b):
    Foo.__init__(self,a)
    Bar.__init__(self,b)

超级怎么知道我是否要同时打电话给这两者?如果是这样,它将如何知道将哪个参数传递到哪里。还是根本不可能在这里使用超级用户?

即使Foo和Bar采取相同的论点也可以super解决这个问题?

还是我不应该首先尝试进行此类操作?

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用super()__init__()以及多重继承是有点棘手。

    在正常情况下, 每个 方法都调用super(),而类仅继承自object做一些额外的工作以确保该方法确实存在:它看起来像这样:

    >>> class Foo(object):
    ...     def frob(self, arg):
    ...         print "Foo.frob"
    ...         if hasattr(super(Foo, self), 'frob'):
    ...             super(Foo, self).frob(arg)
    ... 
    >>> class Bar(object):
    ...     def frob(self, arg):
    ...         print "Bar.frob"
    ...         if hasattr(super(Bar, self), 'frob'):
    ...             super(Bar, self).frob(arg)
    ... 
    >>> class Baz(Foo, Bar):
    ...     def frob(self, arg):
    ...         print "Baz.frob"
    ...         super(Baz, self).frob(arg)
    ... 
    >>> b = Baz()
    >>> b.frob(1)
    Baz.frob
    Foo.frob
    Bar.frob
    >>>
    

    但是,当您尝试使用object实际具有的方法执行类似操作时,事情会变得有些混乱。
    object.__init__不带参数,因此使用它的唯一安全方法是不带参数调用super().__init__(),因为该调用 可能
    由处理object.__init__。但是,它可能 不会 由处理object.__init__,而是由继承图中其他地方的类处理。因此,
    任何__init__在多重继承类层次结构中定义的类都必须准备好不带 参数 地被调用。


    一种解决方法是永远不要在中使用参数__init__()。进行最少的初始化,并在使用前依靠设置属性或使用其他方式配置新对象。但是,那真是令人不快。

    另一种方法是仅使用关键字参数,例如,def __init__(self, **keywords):并始终删除适用于给定构造函数的参数。这是一种基于希望的策略,您 希望
    所有关键词在控制权达到之前就被消耗掉object.__init__

    第三种方式是定义一个超类中的所有其本身限定了多可继承碱基__init__在一些有用的方法和不
    调用super().__init__object.__init__是无操作反正)。这意味着您可以 确保
    始终调用此方法,并且可以随心所欲地使用参数。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看