當前位置:首頁 » 編程語言 » python類多繼承

python類多繼承

發布時間: 2022-08-16 01:28:16

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個沒有的話,再往後找,以此類推。

熱點內容
c緩存池 發布:2025-01-20 13:23:45 瀏覽:6
數控編程帥氣寶塔圖紙 發布:2025-01-20 13:22:15 瀏覽:871
共享文件夾加密軟體 發布:2025-01-20 13:08:41 瀏覽:40
標識符是怎樣存儲的 發布:2025-01-20 13:08:39 瀏覽:894
怎麼看安卓大屏什麼牌子 發布:2025-01-20 13:08:35 瀏覽:258
ios開發java 發布:2025-01-20 13:02:42 瀏覽:881
速騰有側燈的是哪個配置 發布:2025-01-20 13:01:53 瀏覽:371
社保用戶名和密碼都忘記了怎麼辦 發布:2025-01-20 12:55:55 瀏覽:321
最優存儲形式是什麼 發布:2025-01-20 12:51:32 瀏覽:27
centos編譯php7 發布:2025-01-20 12:33:52 瀏覽:920