python 多重继承,继承的几个父类都需要传递参数,怎么在子类计算出父类传递的参数总和呢?

Python020

python 多重继承,继承的几个父类都需要传递参数,怎么在子类计算出父类传递的参数总和呢?,第1张

运行你的代码:出错位置: c = C()

出错结果:TypeError: __init__() missing 1 required positional argument:  ' num1 '

先来看你的程序__main()__部分:a = A(2) 和 b = B(5) 这是类A和类B的一个实例。在python中实例变量是用于每个实例的唯一数据,这就说明你这里的传递参数2或者是5只能用在实例化的 a 或者是 b 下才有作用。  那么重点看 c = C( ) ,c是类对象C的实例化,c 只能用自身实例变量才有用,因此前面的实例 a 下的变量 num1=2 和 实例 b 下的变量 num1=5对实例c是无用的。所以,出错结果很明显了缺少传递的位置参数了。这为什么提示缺少1个位置参数呢?下面为你简单讲解一下吧。你也可以用内置方法__mro__() :查看方法或者属性的调用路径——print(类名.__mro__)

类C是多继承类A和类B的,多继承(不存在super()重写方法下),类C的实例化c是怎么工作的——对于实例c调用方法或属性过程是这样的:查找当前类C中是否存在,然后在多个父类中按照从左往右顺序查找(类A中先查找,类B中后查找),只要在这个过程中找到就退出了,后面的就不再查找了。

好吧,给你分析一下你程序的过程:类A和类B中都有__init__()同一个方法,方法相同那首先就查找呗——先查找类C(没有对__init__()进行修改,那就是跳过了),然后再去类A查找,好嘛这就找到了__init__(self, num1),找到了就退出了。所以这样一看对类C进行实例化就需要传递一个参数给num1就够了。你也可以交换继承位置class C(B, A),这样就是类C实例化需要传递一个参数给num2就够了。这样过程就清晰了。

好第三个问题来了:你类C中有两个参数呀num1和num2,而实例化又仅需要一个参数就够了,这样就肯定会产生问题了。

不信你试试给c = C(2)产生错误:AttributeError: 'C' object has no attribute 'num2'

解决方法1:既然没有属性num2就在类C中删掉就是了,然后c = C(2)就可以运行成功了。

解决方案2:类变量用于类的所有实例共享的属性和方法。因此,要想共用这两个变量num1和num2,就得让搜索的时候不要进到类A和类B中前提下,将它们变成对应的类变量就可以了。第一个前提很好实现:在类C下 定义:def __init__(self) : pass     第二个条件也比较好实现:将类A或类B的 __init__(self, num) : X.num = num   X为对应的类名。(说明:self表示类实例化对象,即self.num 表示实例变量;X表示类对象,则X.num表示类变量),这样就可以共享类A和类B的变量了。

class A:

    def __init__(self, num1):

        A.num1 = num1

class B:

    def __init__(self, num2):

        B.num2 = num2

class C(A, B):

    def __init__(self):

        pass

    def num_sum(self):

        return self.num2 + self.num1

if __name__ == '__main__':

    a = A(2)

    b = B(5)

    c = C()

    print(c.num_sum())

python继承的作用就是为了减少代码。

python允许在一个或多个类的基础上生成新的类,新的类可以使用父类的一些属性和方法,这个过程就叫做继承。

python继承最大的作用就是为了减少代码。

男人和女人统称为人类,都可以继承人类共同的属性,这就是继承的概念。

楼上的回答的很正确,简单来说:在对类D进行实例化的时候,你依次对类C和类A进行了初始化,结果就会以后初始化的B为准了

实际上在子类里并不需要去初始化父类,你在实例化子类的同时,继承自父类的对象都会被创建

class A(object):

    def __init__(self):

        self.a = 1

class B(A):

    def __init__(self):

        self.a = 2

        self.b = 2

class C(B,A):

    pass

>>>c = C()

>>>c.a

>>>2

另外补充一下。父类为新式类的情况下,继承顺序是有影响的。继承顺序上,经典类是深度优先,新式类是广度优先,两种混用的话,分分钟就晕乎了。可以去多做做实验,好好了解。