python类多继承
A. python 多重继承,继承的几个父类都需要传递参数,怎么在子类计算出父类传递的参数总和呢
运行你的代码:出错位置: 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的变量了。
classA:
def__init__(self,num1):
A.num1=num1
classB:
def__init__(self,num2):
B.num2=num2
classC(A,B):
def__init__(self):
pass
defnum_sum(self):
returnself.num2+self.num1
if__name__=='__main__':
a=A(2)
b=B(5)
c=C()
print(c.num_sum())
B. Python中多继承的理解
9.5.1. 多继承
Python 同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
在大多数情况下,在最简单的情况下,你能想到的搜索属性从父类继承的深度优先,左到右,而不是搜索两次在同一个类层次结构中,其中有一个重叠。因此,如果在 DerivedClassName (示例中的派生类)中没有找到某个属性,就会搜索 Base1,然后(递归的)搜索其基类,如果最终没有找到,就搜索 Base2,以此类推。
实际上,super() 可以动态的改变解析顺序。这个方式可见于其它的一些多继承语言,类似 call-next-method,比单继承语言中的 super 更强大 。
动态调整顺序十分必要的,因为所有的多继承会有一到多个菱形关系(指有至少一个祖先类可以从子类经由多个继承路径到达)。例如,所有的 new-style 类继承自 object ,所以任意的多继承总是会有多于一条继承路径到达 object 。
为了防止重复访问基类,通过动态的线性化算法,每个类都按从左到右的顺序特别指定了顺序,每个祖先类只调用一次,这是单调的(意味着一个类被继承时不会影响它祖先的次序)。总算可以通过这种方式使得设计一个可靠并且可扩展的多继承类成为可能。进一步的内容请参见 http://www.python.org/download/releases/2.
C. 47,Python面向对象中的继承有什么特点
单继承与多继承区别:
Python同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承。
继承的性质特征:
子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的变量和方法。
D. python中super为什么能解决多重继承问题
1. super 并不是一个函数,是一个类名,形如 super(B, self) 事实上调用了 super 类的初始化函数,产生了一个 super 对象;
2. super 类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func 的调用并不是用于调用当前类的父类的 func 函数;
4. Python 的多继承类是通过 mro 的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用 super);
5. 混用 super 类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。
6. 用 super,遇到修改父类的名字时等情况
E. Python为什么会引入多继承
按照面向对象的思想,多继承的存在是合理的。只是,多重继承很容易就会导致复杂度失控,所以有的语言就会引入限制,这有点类似于访问控制,比如 java 、 c++ 中的 public 、 private,这是因为设计者假设语言使用者都会偏向写出不好的程序,所以要引入强制控制。相反 python 中就没有语法层面的(双下划线只是改名)访问控制,因为 python 假设使用者都是理性人,什么该访问什么不该访问应该自己去考虑,这和 python 里有多继承是一脉相承的。
F. python3多继承该怎么写(是同时继承多个父类)
classjc(Car,Lunzi):
def__init__(self,paizi,xiaohao,year,lz,x):
Car.__init__(self,paizi,xiaohao,year)
Lunzi.__init__(self,lz)
self.x=x
a=jc('111','111',111,111,111)
print(a.paizi)
G. python中关于多继承失败的问题。(//我想让others继承Student类和Teacher类)
因为这是一个多重菱形继承的典型例子,所以用super函数很难指明继承自哪一个类的构造函数,因此用老方法指明继承自哪一个类的构造函数.
完整的程序如下(学生类和教师类的最后一个参数传错了,就是我加注释的地方)
classPerson(object):
def__init__(self,name,gender):
self.name=name
self.gender=gender
classStudent(Person):
def__init__(self,name,gender,score):
Person.__init__(self,name,gender)
self.score=score
classTeacher(Person):
def__init__(self,name,gender,ID):
Person.__init__(self,name,gender)
self.ID=ID
classOthers(Teacher,Student):
def__init__(self,name,gender,score,ID):
Student.__init__(self,name,gender,score)
Teacher.__init__(self,name,gender,ID)
S=Student('Liverpool','Male','20170702030')#这里传学生类分数属性参数
T=Teacher('Liverpool','Male','2')#这里传教师类ID属性参数
O=Others('Liverpool','Male','20170702030','2')
print(T.name,T.gender,T.ID)
print(S.name,S.gender,S.score)
print(O.name,O.gender,O.ID)
源代码(注意源代码的缩进)
H. python 多继承顺序的问题
是python面试题吧
I. python中单继承和多继承中子类默认继承父类的哪个构造函数
默认是__init__
【1】python中如果子类有自己的构造函数,不会自动调用父类的构造函数,如果需要用到父类的构造函数,则需要在子类的构造函数中显式的调用。
【2】如果子类没有自己的构造函数,则会直接从父类继承构造函数,这在单继承(一个子类只从一个父类派生)中没有任何理解上的问题。
问题:如果是多继承的情况,一个子类从多个父类派生,而子类又没有自己的构造函数,则子类默认会继承哪个父类的构造函数。
【3】子类从多个父类派生,而子类又没有自己的构造函数时,
(1)按顺序继承,哪个父类在最前面且它又有自己的构造函数,就继承它的构造函数;
(2)如果最前面第一个父类没有构造函数,则继承第2个的构造函数,第2个没有的话,再往后找,以此类推。