2016-08-31 24 views
4

我有3個文件,factory_imagenet.py,imdb.py和imagenet.py模塊.__ INIT __()採用至多2個參數誤差在Python

factory_imagenet.py具有:

import datasets.imagenet 

它也有一個函數調用

datasets.imagenet.imagenet(split,devkit_path)) 
... 

imdb.py有:

class imdb(object): 
def __init__(self, name): 
    self._name = name 
    ... 

imagenet.py有:

import datasets 
import datasets.imagenet 
import datasets.imdb 

它還具有

class imagenet(datasets.imdb): 
    def __init__(self, image_set, devkit_path=None): 
     datasets.imdb.__init__(self, image_set) 

所有這三個文件都在數據集文件夾。

當我運行另一個腳本與這些文件交互,我得到這個錯誤:

Traceback (most recent call last): 
    File "./tools/train_faster_rcnn_alt_opt.py", line 19, in <module> 
    from datasets.factory_imagenet import get_imdb 
    File "/mnt/data2/abhishek/py-faster-rcnn/tools/../lib/datasets/factory_imagenet.py", line 12, in <module> 
    import datasets.imagenet 
    File "/mnt/data2/abhishek/py-faster-rcnn/tools/../lib/datasets/imagenet.py", line 21, in <module> 
    class imagenet(datasets.imdb): 
TypeError: Error when calling the metaclass bases 
module.__init__() takes at most 2 arguments (3 given) 

這裏有什麼問題,什麼是要怎麼解決這樣的繼承問題,直觀的解釋?

+0

'datasets.imdb'是一個**模塊**,不能用作**基類**。 –

+0

那麼我該如何解決這個問題? –

+1

刪除'(datasets.imdb)'? –

回答

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

這意味着,你正試圖從一個模塊繼承,而不是從一個類。其實datasets.imdb是一個模塊; datasets.imdb.imdb是你的班級。

你需要改變你的代碼,以便它看起來像這樣:

class imagenet(datasets.imdb.imdb): 
    def __init__(self, image_set, devkit_path=None): 
     datasets.imdb.imdb.__init__(self, image_set) 
+0

那麼我該如何解決這個問題?我怎樣才能重新排列文件? –

+1

@AbhishekShivkumar:更新回答 –

+0

完美,bravo。現在運行!將在5分鐘內接受答案! –

0

當您撥打datasets.imdb.__init__(self, image_set)
您的imdb.__init__方法獲取3個參數。兩個發送和第三隱含self

+0

你是說imdb應該得到3個參數嗎?還是你說它沒有得到3個參數?它是否得到3個參數,這是他們?我只通過一個,正確的(image_set? –

1

下面是另一個可能的原因...

如果你有一個__init__.py文件,請確保您之前導入的超類派生的。

下面是錯誤的方式做到這一點:

from mymodule.InheritedA import InheritedA 
from mymodule.InheritedB import InheritedB 
from mymodule.Parent import Parent 

以上會給出錯誤:

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

但是這將工作:

from mymodule.Parent import Parent 
from mymodule.InheritedA import InheritedA 
from mymodule.InheritedB import InheritedB 

例如文件InheritedA .py可能是:

from mymodule import Parent 

class InheritedA(Agent): 
    def __init__(self): 
     pass 

    def overridden_method(self): 
     print('overridden!!') 
相關問題