导航:首页 > 编程语言 > python多继承初始化方法

python多继承初始化方法

发布时间:2024-08-25 11:47:31

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)

❷ Python子类继承,如果不用父类的函数和方法,应该怎么写

子类继承父类时,如果父类有需要初始化的属性,那么必须在子类中调用父类的初始化方法,帮助父类进行初始化,否则,子类可以不调用父类的初始化方法

代码示例

"""
父类Car中没有属性需要初始化,所有子类中也不需要调用父类的初始化方法
"""


classCar:

defshow_name(self):
print('carname')


classEeleCar(Car):
pass


car=EeleCar()
car.show_name()

❸ Python涓澶氱户镓跨殑鐞呜В锛

9.5.1. 澶氱户镓
Python 钖屾牱链夐檺镄勬敮鎸佸氱户镓垮舰寮忋傚氱户镓跨殑绫诲畾涔夊舰濡备笅渚:
class DerivedClassName(Base1, Base2, Base3):

鍦ㄥぇ澶氭暟𨱍呭喌涓嬶纴鍦ㄦ渶绠鍗旷殑𨱍呭喌涓嬶纴浣犺兘𨱍冲埌镄勬悳绱㈠睘镐т粠鐖剁被缁ф圹镄勬繁搴︿紭鍏堬纴宸﹀埌鍙筹纴钥屼笉鏄鎼灭储涓ゆ″湪钖屼竴涓绫诲眰娆$粨鏋勪腑锛屽叾涓链変竴涓閲嶅彔銆傚洜姝わ纴濡傛灉鍦 DerivedClassName 锛堢ず渚嬩腑镄勬淳鐢熺被锛変腑娌℃湁镓惧埌镆愪釜灞炴э纴灏变细鎼灭储 Base1锛岀劧钖庯纸阃掑綊镄勶级鎼灭储鍏跺熀绫伙纴濡傛灉链缁堟病链夋垒鍒帮纴灏辨悳绱 Base2锛屼互姝ょ被鎺ㄣ
瀹为檯涓婏纴super() 鍙浠ュ姩镐佺殑鏀瑰彉瑙f瀽椤哄簭銆傝繖涓鏂瑰纺鍙瑙佷簬鍏跺畠镄勪竴浜涘氱户镓胯瑷锛岀被浼 call-next-method锛屾瘆鍗旷户镓胯瑷涓镄 super 镟村己澶 銆
锷ㄦ佽皟鏁撮‘搴忓崄鍒嗗繀瑕佺殑锛屽洜涓烘墍链夌殑澶氱户镓夸细链変竴鍒板氢釜凿卞舰鍏崇郴锛堟寚链夎呖灏戜竴涓绁栧厛绫诲彲浠ヤ粠瀛愮被缁忕敱澶氢釜缁ф圹璺寰勫埌杈撅级銆备緥濡傦纴镓链夌殑 new-style 绫荤户镓胯嚜 object 锛屾墍浠ヤ换镒忕殑澶氱户镓挎绘槸浼氭湁澶氢簬涓𨱒$户镓胯矾寰勫埌杈 object 銆
涓轰简阒叉㈤吨澶嶈块梾锘虹被锛岄氲繃锷ㄦ佺殑绾挎у寲绠楁硶锛屾疮涓绫婚兘鎸変粠宸﹀埌鍙崇殑椤哄簭鐗瑰埆鎸囧畾浜嗛‘搴忥纴姣忎釜绁栧厛绫诲彧璋幂敤涓娆★纴杩欐槸鍗曡皟镄勶纸镒忓懗镌涓涓绫昏缁ф圹镞朵笉浼氩奖鍝嶅畠绁栧厛镄勬″簭锛夈傛荤畻鍙浠ラ氲繃杩欑嶆柟寮忎娇寰楄捐′竴涓鍙闱犲苟涓斿彲镓╁𪾢镄勫氱户镓跨被鎴愪负鍙鑳姐傝繘涓姝ョ殑鍐呭硅峰弬瑙 http://www.python.org/download/releases/2.

❹ Python类的多重继承问题深入分析

Python类的多重继承问题深入分析
首先得说明的是,Python的类分为经典类 和 新式类
经典类是python2.2之前的东西,但是在2.7还在兼容,但是在3之后的版本就只承认新式类了
新式类在python2.2之后的版本中都可以使用
经典类和新式类的区别在于:
经典类是默认没有派生自某个基类的,而新式类是默认派生自object这个基类的:
代码如下:
# old style
class A():pass
# new style
class A(obejct):pass
2.经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的..而新式类是采用C3算法(不同于广度优先)进行匹配的
3.经典类是没有__MRO__和instance.mro()调用的,而新式类是有的.
为什么不用经典类,要更换到新式类
因为在经典类中的多重继承会有些问题...可能导致在继承树中的方法查询绕过后面的父类:
代码如下:
class A():
def foo1(self):
print "A"
class B(A):
def foo2(self):
pass
class C(A):
def foo1(self):
print "C"
class D(B, C):
pass
d = D()
d.foo1()
按照经典类的查找顺序从左到右深度优先的规则,在访问d.foo1()的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过.
所以python引入了新式类的概念,每个基类都继承自object并且,他的匹配规则也从深度优先换到了C3
C3算法
C3算法是怎么做匹配的呢..在问答版块上面讨论之后,归结如下:
C3算法的一个核心是merge.
在merge列表中,如果第一个序列mro的第一个类是出现在其它序列,并且也是第一个,或者不出现其它序列,那么这个类就会从这些序列中删除,并合到访问顺序列表中
比如:(引用问题中zhuangzebo的回答@zhuangzebo)
代码如下:
class A(O):pass
class B(O):pass
class C(O):pass
class D(A,B):pass
class E(C,D):pass

首先需要知道 O(object)的mro(method resolution order)列表是[O,]
那么接下来是:
代码如下:
mro(A) = [A, O]
mro(B) = [B, O]
mro(C) = [C, O]
mro(D) = [D] + merge(mro(A), mro(B), [A, B])
= [D] + merge([A, O], [B, O], [A, B])
= [D, A] + merge([O], [B, O], [B])
= [D, A, B] + merge([O], [O])
= [D, A, B, O]
mro(E) = [E] + merge(mro(C), mro(D), [C, D])
= [E] + merge([C, O], [D, A, B, O], [C, D])
= [E, C] + merge([O], [D, A, B, O], [D])
= [E, C, D] + merge([O], [A, B, O])
= [E, C, D, A, B] + merge([O], [O])
= [E, C, D, A, B, O]

然后还有一种特殊情况:
比如:
merge(DO,CO,C) 先merge的是D
merge(DO,CO,C) 先merge的是C
意思就是.当出现有 一个类出现在两个序列的头(比如C) 这种情况和 这个类只有在一个序列的头(比如D) 这种情况同时出现的时候,按照顺序方式匹配。
新式类生成的访问序列被存储在一个叫MRO的只读列表中..
你可以使用instance.__MRO__或者instance.mro()来访问
最后匹配的时候就按照MRO序列的顺序去匹配了
C3和广度优先的区别:
举个例子就完全明白了:
代码如下:
class A(object):pass
class B(A):pass
class C(B):pass
class D(A):pass
class E(D):pass
class F(C, E):pass

按照广度优先遍历,F的MRO序列应该是[F,C,E,B,D,A]
但是C3是[F,E,D,C,B,A]
意思是你可以当做C3是在一条链路上深度遍历到和另外一条链路的交叉点,然后去深度遍历另外一条链路,最后遍历交叉点
新式类和经典类的super和按类名访问问题
在经典类中,你如果要访问父类的话,是用类名来访问的..
代码如下:
class A():
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
A.__init__(self) #python不会默认调用父类的初始化函数的

这样子看起来没三问题,但是如果类的继承结构比较复杂,会导致代码的可维护性很差..
所以新式类推出了super这个东西...
代码如下:
class A():
def __init__(self):
print "A"
class B(A):
def __init__(self):
print "B"
super(B,self).__init__()

这时候,又有一个问题:当类是多重继承的时候,super访问的是哪一个类呢?
super实际上是通过__MRO__序列来确定访问哪一个类的...实际上就是调用__MRO__中此类后面的一个类的方法.
比如序列为[F,E,D,C,B,A]那么F中的super就是E,E的就是D
super和按照类名访问 混合使用带来的坑
代码如下:
class A(object):
def __init__(self):
print "enter A"
print "leave A"
class B(object):
def __init__(self):
print "enter B"
print "leave B"
class C(A):
def __init__(self):
print "enter C"
super(C, self).__init__()
print "leave C"
class D(A):
def __init__(self):
print "enter D"
super(D, self).__init__()
print "leave D"
class E(B, C):
def __init__(self):
print "enter E"
B.__init__(self)
C.__init__(self)
print "leave E"
class F(E, D):
def __init__(self):
print "enter F"
E.__init__(self)
D.__init__(self)
print "leave F"
这时候打印出来是:
代码如下:
enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F

可以看出来D和A的初始化函数被乱入了两次!
按类名访问就相当于C语言之前的GOTO语句...乱跳,然后再用super按顺序访问..就有问题了
所以建议就是要么一直用super,要么一直用按照类名访问
最佳实现:
避免多重继承
super使用一致
不要混用经典类和新式类
调用父类的时候注意检查类层次
以上便是本人对于python类的继承的认识了,希望对大家能有所帮助

❺ Python中的面向对象(高级)之私有方法、多继承、多态

特征:私有属性与私有方法不能从外部被调用,也不能被子类继承

唯一写法:在属性或方法前面加上__(两个下划线)

我们写一个简单的例子,创建一个类,包含私有方法、私有属性、普通方法、普通属性,并生成一个实例

私有属性和私有方法可以从内部被调用(总不能我写了,但是哪都不让用吧)

我们试试在类里再加入一个新的方法,调用私有方法和属性

可以看到,私有属性和私有方法是可以在类内部被调用的。

举个私有属性应用场景的例子


二。object类

我们试一下


三。多继承

一个子类可以继承多个父类,用逗号隔开

多个父类中有同名方法时,按照继承顺序进行调用


四。多态

当不同的实例,有同名的方法时,我们可以一个函数,传入不同的实例,执行对应的方法。

我们定义一个猫和一个狗的类,两个类中都有'叫'的方法。并各生成一个实例。

定义一个函数,用函数来调用'叫'的方法

这就叫多态。

阅读全文

与python多继承初始化方法相关的资料

热点内容
linux好用的编辑器 浏览:998
linuxpartprobe 浏览:315
视频教育网站源码 浏览:513
java指定位数的随机数 浏览:900
300公斤压缩机 浏览:549
java时间转换毫秒数 浏览:290
我的世界怎么开挂在服务器 浏览:848
app怎么退定金 浏览:925
php获取外网地址 浏览:172
单片机lan 浏览:582
html炫酷黑页源码 浏览:955
如何远程更新服务器 浏览:785
服务器导轨怎么安装图解 浏览:984
如何设置加密共享文档 浏览:656
单片机双灯左移右移 浏览:927
网页无法打开pdf 浏览:556
linux命令scp 浏览:519
怎样把图片转为pdf格式 浏览:115
linux变量类型 浏览:840
linux中网卡配置 浏览:704