2017-10-05 41 views
3

考慮以下幾點:什麼是傳遞給模塊__init __()的隱式參數?

ParentModule.py

class ParentClass(): 
    def __init__(self): 
     pass 

ChildModule.py

class ChildClass(ParentClass): 
    def __init__(self): 
     pass 

如果在ChildModule,我錯誤地導入父模塊,而不是父類,即:

import ParentModule 

而不是正確的

from ParentModule import ParentClass 

我會收到以下錯誤:

TypeError: module.__init__() takes at most 2 arguments (3 given) 

到底什麼是傳遞到ParentModule's __init__()這3個參數隱? ParentModule.__init__()期望的2個參數是什麼?

如何利用此功能?

+0

我無法重現。兩個模塊都在同一個目錄中嗎?我得到的唯一錯誤是:'NameError:name'ParentClass'未定義'。 –

+0

是的,'ParentClass'和'ParentModule'很可能在實際代碼中有相同的名稱,或者真正的代碼有'class ChildClass(ParentModule)'而不是'class ChildClass(ParentClass)'。 – user2357112

+0

@ChristianDean:是的,真正的模塊/類名稱將是Parent.Parent和Child.Child,但我覺得使用該術語沒有說明問題。如果你認爲這樣會更清楚,隨意編輯這個問題。 –

回答

4

首先,錯誤信息有點誤導,因爲它忽略了隱含的self參數。它應該可能說takes at most 3 arguments (4 given),佔self

如果你看一看的help輸出模塊類型:

>>> import sys 
>>> help(type(sys)) 

,你會看到以下內容:

Help on class module in module builtins: 

class module(object) 
| module(name[, doc]) 
| 
| Create a module object. 
| ... 

因此,模塊式的__init__應該採取最多3個參數:self(未列出),name(模塊名稱)和可選的doc(文檔字符串)。


這不是你通過它。當你誤做

import ParentModule 

class ChildClass(ParentModule) 

Python的假設ParentModule是一個奇怪的元類的一類,並使用type(ParentModule)找一下應該是元類。它發現模塊類型,並用3個參數調用它:名稱('ChildClass'),基地((ParentModule,)),以及新類的字典你想創建:

type(ParentModule)('ChildClass', (ParentModule,), {'__init__': ..., ...}) 

這導致使用4個參數調用模塊類型的__init__(在前面插入self),而模塊類型的__init__不喜歡這樣,所以會引發錯誤。


欲瞭解更多有關課程創作細節的信息,請參閱Python data model documentation on metaclasses

+0

出色的工作!我應該想過在模塊對象上運行help()。 –

0

當您導入模塊時,代碼將在模塊中加載__init__.py文件。 如果你想使用的init,例如預加載的模塊,您可以添加代碼爲__init__.py

model/ 
    __init__.py 
    func1.py 
    func2.py