1.Python为什么会引入多继承
按照面向对象的思想,多继承的存在是合理的。
只是,多重继承很容易就会导致复杂度失控,所以有的语言就会引入限制,这有点类似于访问控制,比如 java 、c++ 中的 public 、private,这是因为设计者假设语言使用者都会偏向写出不好的程序,所以要引入强制控制。相反 python 中就没有语法层面的(双下划线只是改名)访问控制,因为 python 假设使用者都是理性人,什么该访问什么不该访问应该自己去考虑,这和 python 里有多继承是一脉相承的。
2.Python的发展历程有知道的吗?介绍介绍呗
自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。
之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。 ABC是由Guido参加设计的一种教学语言。
就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。 但是ABC语言并没有成功,究其原因,Guido 认为是其非开 标识 放造成的。
Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。
并且结合了Unix shell和C的习惯。 。
3.关于Python的定义你知道多少呢
Python [1] (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)许可。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。
7月20日,IEEE发布2017年编程语言排行榜:Python高居首位 [2] 。 2018年3月,该语言作者在邮件列表上宣布 Python 2.7将于2020年1月1日终止支持。
用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。 [3]。
4.怎么用好python中的多继承
怎么用好python中的多继承
可能你有C++的基础吧,C++确实可以不用带上this。
我把你的代码稍微改了一下,你可以分别看看cls1.n、cls2.n、self.n的输出。
class cls1:
n=3
class cls2(cls1):
def __init__(self,cls1=cls1):
cls2.n += 1
self.n += 2
print 'cls1.n:%s'%cls1.n
print 'cls2.n:%s'%cls2.n
print 'self.n:%s'%self.n
cls2()
print 'cls1.n:%s'%cls1.n
可以看出两个类和一个对象都可以在这里调用它们的n属性,如果只敲一个n别人读你的代码时就比较容易产生岐义,虽然少打了5个字符,但是不符合简单明确的pythonic哲学。
当然你也可以就认为python语法规则就是这么规定的。
5.python的多重继承问题
楼上的回答的很正确,简单来说:在对类D进行实例化的时候,你依次对类C和类A进行了初始化,结果就会以后初始化的B为准了 实际上在子类里并不需要去初始化父类,你在实例化子类的同时,继承自父类的对象都会被创建 class A(object): def __init__(self): self.a = 1class B(A): def __init__(self): self.a = 2 self.b = 2class C(B,A): pass>>> c = C() >>> c.a >>> 2 另外补充一下。
父类为新式类的情况下,继承顺序是有影响的。继承顺序上,经典类是深度优先,新式类是广度优先,两种混用的话,分分钟就晕乎了。
可以去多做做实验,好好了解。
6.Python可以多继承吗
Python支持多继承,与C++一样都会出现一种问题:子类继承的多个父类又继承了同一个父类,这时就有可能会出现父类构造方法被调用多次的情况。关于这个问题,我找了一些资料,虽然没有亲自全部验证,这里我总结一下自己对这个问题的看法。
Python和C++的关于这个问题的解决方案不太一样,当然Python还要看它的版本。
C++用的方案是引入了虚继承的语法避免同一个类被构造了多次。
Python用的方法是MRO(method resolution order,方法解析顺序) 。在在Python2.3之前,MRO的实现是基于DFS的,而在Python2.3以后MRO的实现是基于C3算法。找到的资料解释了一下更换算法的原因:
为什么采用C3算法
C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。
本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。
单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。
------------------------------新式类和旧式类中查找属性的顺序不同-------------------------------------
在新式类中,查找一个要调用的函数或者属性的时候,是广度优先搜搜的。
在旧式类当中,是深度优先搜索的。
7.python多重继承下super问题
楼上的回答的很正确,简单来说:在对类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
另外补充一下。父类为新式类的情况下,继承顺序是有影响的。继承顺序上,经典类是深度优先,新式类是广度优先,两种混用的话,分分钟就晕乎了。可以去多做做实验,好好了解。
转载请注明出处编程代码网 » python多继承经典(Python为什么会引入多继承)