鉴于以下内容:
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)
那么这3个隐含参数传递给ParentModule's __init__()
的是什么? ParentModule.__init__()
期待的两个参数是什么?
如何利用此功能?
答案 0 :(得分: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
1}}(文档字符串)。
那不是你传递给它的东西。当你错误地做
import ParentModule
class ChildClass(ParentModule)
Python假设ParentModule
是一个具有奇怪元类的类,并使用type(ParentModule)
来查找应该是元类的内容。它找到模块类型,并使用3个参数调用它:名称('ChildClass'
),基数((ParentModule,)
),以及您尝试创建的新类的字典:< / p>
type(ParentModule)('ChildClass', (ParentModule,), {'__init__': ..., ...})
这会导致调用模块类型__init__
,其中包含4个参数(在前面插入self
),模块类型的__init__
没有&{ #39; t那样,所以它会抛出一个错误。
有关课程创建详情的更多阅读,请参阅Python data model documentation on metaclasses。
答案 1 :(得分:0)
导入模块时,代码将在模块中加载__init__.py
文件。
如果您想使用init,例如预加载模块,您可以将代码添加到__init__.py
model/
__init__.py
func1.py
func2.py