web-dev-qa-db-ja.com

TypeError:super()は少なくとも1つの引数(0を指定)を取ります。エラーはpythonバージョンに固有ですか?

このエラーが発生しています

TypeError:super()は少なくとも1つの引数を取ります(0を指定)

python2.7.11でこのコードを使用:

class Foo(object):
    def __init__(self):
        pass

class Bar(Foo):
    def __init__(self):
        super().__init__()

Bar()

動作させるための回避策は次のとおりです。

class Foo(object):
    def __init__(self):
        pass

class Bar(Foo):
    def __init__(self):
        super(Bar, self).__init__()

Bar()

構文はpython 3に固有のようです。では、2.xと3.xの間で互換性のあるコードを提供し、このエラーの発生を回避する最良の方法は何でしょうか。

47
BPL

はい、引数が0の構文はPython 3に固有です- Python 3.0の新機能 および PEP 3135-新しいスーパー .

Python 2およびバージョン間の互換性が必要なコードでは、クラスオブジェクトとインスタンスを明示的に渡すだけにしてください。

はい、super()の引数なしバージョンをPython 2(futureライブラリなど)で機能させる「バックポート」がありますが、これらには以下を含む多くのハックが必要です。 クラス階層の完全スキャン 一致する関数オブジェクトを見つけます。これは壊れやすく、低速であり、「利便性」に値するものではありません。

44
Martijn Pieters

これは、Pythonのバージョンが原因です。 [python --version]でpythonバージョンを確認してください。2.7

In 2.7 use this [ super(baseclass, self).__init__() ]

class Bird(object):
    def __init__(self):
        print("Bird")

    def whatIsThis(self):
        print("This is bird which can not swim")

class Animal(Bird):
    def __init__(self):
        super(Bird,self).__init__()
        print("Animal")

    def whatIsThis(self):
        print("THis is animal which can swim")

a1 = Animal()
a1.whatIsThis()

> In 3.0 or more use this [ super().__init__()]

class Bird(object):
    def __init__(self):
        print("Bird")

    def whatIsThis(self):
        print("This is bird which can not swim")

class Animal(Bird):
    def __init__(self):
        super().__init__()
        print("Animal")

    def whatIsThis(self):
        print("THis is animal which can swim")

a1 = Animal()
a1.whatIsThis()
6
Viraj.Hadoop

future ライブラリを使用して、Python2/Python3との互換性を持たせることができます。

super 関数はバックポートされています。

3
Laurent LAPORTE

デフォルトのpython --versionはおそらくpython2であるため、この構文を使用するにはpython3に切り替える必要があります。そうするには、次のコマンドを端末に貼り付けます。

Sudo update-alternatives --config python

「pythonの代替がない」というエラーが表示された場合は、次のコマンドを使用して自分で代替を設定します。

Sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

次にpythonバージョンを確認します

python --version

バージョン3. +を入手すれば、問題は解決します。

0
Manzur Alahi