【问题标题】:cannot make inheritance work with super in module [duplicate]无法使继承与模块中的超级一起工作[重复]
【发布时间】:2015-01-31 13:19:11
【问题描述】:

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

from .Dataset import Dataset
from .CSVDataset import CSVDataset

CSVDataset.py

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。当我像这样从../dataset 使用它时

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

它仅适用于Dataset.__init__(self)。它应该与super(CSVDataset, self).__init__() 一起工作,但事实并非如此。这是为什么呢?

更新:我收到错误

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

数据集草稿:

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

【问题讨论】:

  • 您的 super() 版本对我来说是正确的。您收到什么错误消息?
  • 你能把class Dataset的定义也包括进来吗?大概这是 Python 2?
  • 对,异常告诉你Dataset是旧式的类,不是新式的统一类型。

标签: python


【解决方案1】:

您的 Dataset 类是 Python 2.x 旧样式类super() 仅适用于 new style classes,其中类层次结构最终继承自 object

要修复,让Dataset 继承自object

class Dataset(object):

另见What is the difference between old style and new style classes in Python?

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2015-12-24
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多