2016-10-13 6 views
1

私はかなりPythonを初めて使いました。以下のコードの抜粋を私が使っている本から取りました。super().__ init__を使用しようとしたときにエラーが発生しました

それは、それが書かれているよう正確の下にリストされていると、本の中で説明したが、まだそれは、次のエラーがスローされます。

TypeError: super() takes at least 1 argument (0 given) 

私はsuperに引数を与えることをしようとすると、それはそれはする必要が私に語りましたタイプである。

私は複数のスレッドを検索しましたが、まだ運がありませんでした。あなたは、Python 2、ないのPython 3 Python 2's superを実行している

class Car(): 
    """A simple attempt to represent a car""" 

    def __init__(self, make, model, year): 
     """Initialize attributes to describe a car""" 
     self.make = make 
     self.model = model 
     self.year = year 
     self.odometer_reading = 0 


    def get_descriptive_name(self): 
     """Return a neatly formatted descriptive name.""" 
     long_name = str(self.year) + ' ' + self.make + ' ' + self.model 
     return long_name.title() 

class ElectricCar(Car): 

    def __init__(self, make, model, year): 
     super().__init__(make, model, year) 


my_tesla = ElectricCar('tesla', 'model s', 2016) 
print(my_tesla.get_descriptive_name()) 
+5

を。 – zondo

+1

^これは有効なPythonコードなので、おそらく "以前はPythonと呼ばれていたバージョン"を使用しています... – wim

答えて

2

は、少なくとも一つの引数(このメソッドが定義されたタイプ)、および通常は2(現在のタイプとself)が必要です。引数なしで呼び出すことができるのはPython 3's superです。

の下であなたが実行している実際のバージョンを報告しますあなたのスクリプトの先頭に以下を追加して確認し、:

import sys 

print(sys.version_info) 

注:ElectricCar年代脇__init__に何もしていないので、同じ引数を使用してCar__init__に委任することから、__init__ElectricCarに完全に定義することをスキップできます。 ElectricCarを初期化する__init__を定義していないCarサブクラスを初期化するときCarが、そうでない場合は、Car sの初期化が自動的に呼び出され、初期化とは別の何かを必要とする場合にのみ、明示的に委任して__init__をオーバーライドする必要があります。書かれたとして、あなたはにElectricCarを簡素化することができます:

class ElectricCar(Car): 
    pass 

、それは(それはそれがすべてです、__init__の不要な傍受や委任を避けることによって、わずかに速く実行します)同じように動作します。

+0

さらに、Python 2のクラスは常に 'object'から継承する必要があります。超包括的ではありません。 – jsbueno

+0

@jsbueno:Yar。 Python 2でも(Python 3では '__metaclass__'を無視して)暗黙のうちに新しいスタイルを定義するように、ファイルの上部近くに(クラスを定義する前に)' __metaclass__ = type'を明示的に追加することができます。だからそこにはコストはない)。しかしこの場合、問題はOPがPy3上にいると思っているのですが、実際にはPy2上にいると思っています。正しいバージョンのPythonを実行すると問題は解消されます。 – ShadowRanger

+0

それは本当に問題でした。ご協力いただきありがとうございます。 –

0

Pythonで2.7あなたElectricCarクラスには、次のようになります。あなたが問題を抱えている場合は、おそらくPythonの2を使用しているので、有効なPython 3のコードは、ある

class Car(object): 
    blah blah blah 


class ElectricCar(Car): 
    def __init__(self, make, model, year): 
     super(ElectricCar, self).__init__(make, model, year) 
関連する問題