【问题标题】:how to write __init__ in python multiple inheritance to instantiate all variables如何在python多重继承中编写__init__来实例化所有变量
【发布时间】:2014-06-15 21:30:45
【问题描述】:
class FakeBase(object):
    def __init__(self, *args):
        pass

class Parent(FakeBase):
    def __init__(self, x=1, *args):
        super().__init__(x, *args)
        self.var1 = x

class Parent2(FakeBase):
    def __init__(self, x=3, y=4, *args):
        super().__init__(x, y, *args)
        self.var2 = x
        self.var3 = y

class Child(Parent, Parent2):
    def __init__(self, z, *args):
        super().__init__(*args)
        self.var4 = z

childObject = Child("var4", "var3", "var1", "var2")
print(childObject.var1)
print(childObject.var2)
print(childObject.var3)
print(childObject.var4)

结果是:

var3
var3
var1
var4

我刚开始处理 Python 多重继承。

在这里,我只能用一个参数调用super().__init__(x)。它只会调用父母的__init__()。我也想初始化var2var3。该怎么做?

从您的回答中获得成功,我尝试修改我的代码。

但是,仍然无法初始化所有四个参数。你的答案都没有。

谢谢,还在等待答复。

【问题讨论】:

标签: python python-3.x multiple-inheritance super


【解决方案1】:

这是基于@jonrsharpe 建议的解决方案。方法对传递给父级的通用变量使用 *args 签名。具体变量z单独捕获,类使用。

来源

class parent(object):
    var1=1
    def __init__(self,x=1):
        self.var1=x

class parent2(object):
    var2=11
    var3=12
    def __init__(self,x=3,y=4):
        self.var2=x
        self.var3=y

    def parprint(self):
        print(self.var2)
        print(self.var3)

class child(parent, parent2):
    var4=5
    def __init__(self, z, *args):
        super(child,self).__init__(*args)
        self.var4 = z

childobject = child(9,"var3")
print(childobject.var1)
print(childobject.var2)
print(childobject.var3)
print(childobject.var4)
childobject.parprint()

输出

var3
11
12
9
11
12

【讨论】:

    【解决方案2】:

    发生的事情如下:

    1. Child"var4" 抓取到其参数 z 并传递 args 列表 ["var3", "var1", "var2"]父级
    2. Parent"var3" 抓取到它的参数 x 并传递 x and args 列出 ["var1", "var2"]Parent2(因此它同时获取并传递相同的值 "var3")。
    3. Parent2 抓取 "var3""var1" 并将 args 列表 ["var2"] 传递给 FakeBase。

    如果你知道方法解析顺序(MRO),你可以使用*args,但是如果你创建新的子类或超类,MRO可能会改变,使你的代码非常不稳定。更好的方法是使用关键字参数**kwargs。每个类获取它需要的变量并传递其余的变量。

    class FakeBase(object):
        def __init__(self, **kwargs):
            pass
    
    
    class Parent(FakeBase):
        def __init__(self, var1=1, **kwargs): # Takes var1 out from **kwargs.
            super().__init__(**kwargs)  # Passing on the rest {}.
            self.var1 = var1
    
    
    class Parent2(FakeBase):
        def __init__(self, var2=3, var3=4, **kwargs): # Takes var2 and var3 out from **kwargs.
            super().__init__(**kwargs)  # Passing on the rest {var1: "var1"}.
            self.var2 = var2
            self.var3 = var3
    
    
    class Child(Parent, Parent2):
        def __init__(self, var4, **kwargs):  # Takes var4 out from **kwargs.
            super().__init__(**kwargs)  # Passing on the rest {var1: "var1", var2: "var2", var3: "var3"}.
            self.var4 = var4
    

    通过这种方式编写,MRO 无关紧要,初始化 Child 时参数的顺序也无关紧要:

    childObject = Child(var1="var1", var2="var2", var3="var3", var4="var4")
    print(childObject.var1, childObject.var2, childObject.var3, childObject.var4)
    # OUTPUT: var1 var2 var3 var4
    
    childObject = Child(var4="var4", var1="var1", var3="var3", var2="var2")
    print(childObject.var1, childObject.var2, childObject.var3, childObject.var4)
    # OUTPUT: var1 var2 var3 var4
    

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      相关资源
      最近更新 更多