关于python:无法在模块中使用super进行继承工作

cannot make inheritance work with super in module

本问题已经有最佳答案,请猛点这里访问。

我读过通过super(..).__init__()调用祖先的构造函数的新方法,并想使用它。我有一个目录数据集,有三个文件:__init__.py

1
2
from .Dataset import Dataset
from .CSVDataset import CSVDataset

CSVDataset.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import csv
import numpy as np
from dataset import Dataset


class CSVDataset(Dataset):
   """
    reads dataset from csv file
   """

    def __init__(self, file):
        Dataset.__init__(self)
        #super(CSVDataset, self).__init__()
        reader = csv.reader(open(file, 'r'), delimiter=',')
        x = list(reader)
        self.container = np.array(x).astype('double')

Dataset.py。当我像这样使用它的时候

1
2
from dataset import CSVDataset
data = CSVDataset('test/data1')

它只适用于Dataset.__init__(self)。它应该与super(CSVDataset, self).__init__()一起工作,但它不工作。为什么会这样?

更新:我得到错误

1
2
3
4
5
6
>>> data = CSVDataset('test/data1')
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
  File"dataset/CSVDataset.py", line 13, in __init__
    super(CSVDataset, self).__init__()
TypeError: must be type, not classobj

数据集草案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Dataset(Iterable):
   """
    base class representing dataset API.
    Remember, dataset is used for learning.
   """

    def __init__(self):
        self.container = None
        self.counter = None
    ....

class Iterable:
    def __iter__(self):
        self.counter = 0
        return self

    def __next__(self):
        try:
            label = self[self.counter]
            self.counter += 1
            return label
        except:
            raise StopIteration


您的Dataset类是一个python 2.x旧样式的类。super()只适用于新样式的类,类层次结构最终从object继承。

修复,使Datasetobject继承:

1
class Dataset(object):

另外,看看在Python中旧样式类和新样式类的区别是什么?