【问题标题】:How to properly use super().__init__() in python 3?如何在 python 3 中正确使用 super().__init__()?
【发布时间】:2020-03-13 02:12:52
【问题描述】:

我编写了以下代码,但会引发错误。我想知道我应该修改我的代码以成功执行以及管理其操作的规则,以便我将来可以避免这个问题。

我在这里要做的是定义一个类,DataLoader,它加载一个语料库,分成训练和测试集,以及完整和测试词汇集。所有这些都没有问题。

当我尝试在 Model 类中继承 DataLoader 类时出现问题。我想用 DataLoader 类的所有属性以及一个附加属性 n 来初始化 Model 类的实例。我不清楚为什么这段代码没有达到这个效果。


from nltk.corpus import brown

class DataLoader():

    def __init__(self,data,train_ratio):
        self.all = [sent for sent in data.sents()]

        num_ex = len(self.all)
        num_train = int(train_ratio * num_ex)

        self.train = [word.lower() for sent in self.all[:num_train] for word in sent] 
        self.test = [word.lower() for sent in self.all[num_train:] for word in sent] 

        self.full_vocab = [word.lower() for word in set(data.words())]
        self.train_vocab = list(set(self.train))

        return None

class Model(DataLoader):

    def __init__(self,data,train_ratio,n):

        self.n = n
        super().__init__(self,data,train_ratio)

bgrams = Model(data=brown, train_ratio=0.5, n=2)

并引发以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-d641225c06d6> in <module>()
----> 1 bgrams = Model(data=brown,train_ratio=0.5,n=2)
      2 # bgrams.compute_bigram()

<ipython-input-15-98b0485bce38> in __init__(self, data, train_ratio, n)
      9 
     10         self.n = n
---> 11         super(Model).__init__(self,data,train_ratio)
     12 
     13 

TypeError: super() takes at most 2 arguments (3 given)

【问题讨论】:

  • 使用super时不包括selfsuper().__init__(data, train_ratio)

标签: python oop init super


【解决方案1】:

简单,只需从 super 子句中删除 self;您的代码应如下所示:


class Model(DataLoader):

    def __init__(self,data,train_ratio,n):

        self.n = n
        super().__init__(data,train_ratio)

【讨论】:

    【解决方案2】:

    您必须不传递 self 并且按照惯例,super 调用是第一个调用,因为它可能会影响下一个初始化语句

    class Model(DataLoader):
        def __init__(self, data, train_ratio, n):
            super().__init__(data, train_ratio)
            self.n = n
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2016-05-17
      相关资源
      最近更新 更多