传递给模块__init __()的隐式参数是什么?

时间:2017-10-05 17:37:45

标签: python python-3.x

鉴于以下内容:

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__()期待的两个参数是什么?

如何利用此功能?

2 个答案:

答案 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