Python 导入模块会导致TypeError:module.\uuuuu init\uuuuu()最多接受2个参数(给定3个)
请不要标记为重复,其他类似的问题并没有解决我的问题 这是我的设置Python 导入模块会导致TypeError:module.\uuuuu init\uuuuu()最多接受2个参数(给定3个),python,python-3.x,Python,Python 3.x,请不要标记为重复,其他类似的问题并没有解决我的问题 这是我的设置 /main.py /actions/ListitAction.py /actions/ViewAction.py Main.py: from actions import ListitAction, ViewAction ListAction.py: class ListitAction(object): def __init__(self): #some init behavior def
/main.py
/actions/ListitAction.py
/actions/ViewAction.py
Main.py:
from actions import ListitAction, ViewAction
ListAction.py:
class ListitAction(object):
def __init__(self):
#some init behavior
def build_uri():
return "test.uri"
ViewAction.py
from actions import ListitAction
class ViewAction(ListitAction):
def __init__(self, view_id):
ListitAction.__init__(self)
self.view_id = view_id
def build_uri():
return "test"
运行:
$ python3 main.py
我收到的唯一错误消息是:
回溯(最近一次呼叫最后一次):
文件“/home/jlevac/workspace/project/listit.py”,第11行,在
从操作导入ListAction、ViewAction、CommentsAction
文件“/home/jlevac/workspace/project/actions/ViewAction.py”,第3行,在
类ViewAction(ListAction):
TypeError:module.\uuuuu init\uuuuuu()最多接受2个参数(给定3个)
即使我尝试使用python3控制台,也会收到相同的错误消息:
$python3
from actions import ViewAction
我是Python新手,但对编程并不陌生。我假设我的错误消息与导入语句有关,但根据消息,我无法真正理解它的含义。您正在传递
self
,而您不需要传递,仅此而已。编辑:由于我不想窃取内容,请参见MSeifert的注释答案。您的导入错误,因此您试图从模块本身继承,而不是从模块内部定义的类(同名)继承
from actions import ListitAction
在ViewAction.py中
应为:
from actions.ListitAction import ListitAction
同样,所有其他用途应切换到从actions显式导入。XXX导入XXX
(由于名称重复),例如从actions导入ListAction导入,ViewAction
必须成为两个导入:
from actions.ListitAction import ListitAction
from actions.ViewAction import ViewAction
因为导入的类来自actions
包下的不同模块。创建类和变量实例
为学生类创建两个实例变量
遗产
如果文件位于项目的根目录中,则可以直接写入文件名并导入 例如,如果文件名是
Parent1.py
,类名是Parent
,那么您将编写
from Parent1 import Parent
但是,如果您的文件Parent1.py
位于任何文件夹下,例如:
DemoFolder -> Parent1.py- > Parent
(Folder). (File). (Class name)
然后你必须写:
from Test.Parent1 import Parent
哪里在子类中?您是否定义了
\uuuu init\uuuu.py
文件,或者在python路径中包含了目录?如果您将所有内容都放在主文件中,该示例是否有效?@ShadowRanger的可能重复问题虽然“可能重复”问题的标题与此问题几乎相同,但在两个问题中抛出错误的原因是不同的(即,该问题的答案对我没有帮助,而此处接受的答案对我没有帮助)Python不能使用相对路径,因此它取决于\uuuuu init\uuuuuuuuu.py
的设置方式。如果他将所有内容导入全局操作
空间,它应该像OP那样工作。如果不是,你的答案是正确的。这是遵循命名约定的一个原因,即只有类名是大写的,模块名应该是小写的;更容易看到的是,您没有在您认为的位置导入类名。@MSeifert:OP得到的错误表明,他们没有在\uuuu init\uuuuuuuuuuuuy.py
中巧妙地获得该行为;当你试图让一个类从一个模块继承时,这个错误消息正是你期望看到的。因此,文件不是一个特定的类,而是一个模块。明白了。我没有init.py设置,我不知道这一点。@levacjeep:我很惊讶它居然能工作;您至少需要一个空的\uuuu init\uuu.py
,包才能正常工作。无论如何,是的,Java很奇怪,因为它只允许每个源文件定义一个(非嵌套)类。Python和大多数其他OO语言可以为每个模块定义许多类。考虑到您的用例(假设它不够复杂,不足以证明可以拆分为单独的源文件),您可能只需要创建一个actions.py
文件并在其中定义这两个类,这样就省去了这些单独导入的麻烦。
from Parent1 import Parent
DemoFolder -> Parent1.py- > Parent
(Folder). (File). (Class name)
from Test.Parent1 import Parent