3

この方法で単純なクラス階層に super() を使用しようとしています:

class Employee(object):
    def __init__(self, name):
        self.name = name

class FullTime(Employee):
    def __init__(self, name, satOff, freeDays=[], alDays=[], programDays=[]):
        global satsOffDict
        global dayDict
        super(Employee, self).__init__(name)

ただし、次のエラーが発生します。

TypeError: object.__init__() takes no parameters

スーパーが機能するためには、親オブジェクト タイプ オブジェクト (新しいスタイル クラス) を作成する必要があることを読みました。クラス Employee(object) をクラス Employee() に変更すると、次のエラーが発生します。

TypeError: must be type, not classobj

どうしたの?

4

2 に答える 2

7

で現在のクラスを使用しますsuper()

super(FullTime, self).__init__(name)

super()最初の引数に関連する要求されたメソッドを探します。Employee親クラスを探して、代わりに検索を開始しました。object.__init__()その場合に一致する次の親メソッドです。

Python はMethod Resolution Orderで基本クラスを検索する必要があるため、現在のクラスを使用する必要があります。その順序は、現在のクラスがその基本クラスからどのように派生するかによって異なります (特に、複数の継承がある場合、または基本クラスが複数回参照される場合)。

Python 3.x では、super()引数なしで を使用できます。コンパイラは、メソッドに追加のヒントを追加して、開始する正しいクラスを決定できるようにします。

于 2013-01-09T16:43:24.017 に答える
2

superPython で使用する場合は、最初のパラメーターとして派生型 (つまり、呼び出しを記述しているクラス) を指定する必要があります。

super(FullTime, self).__init__(name)
于 2013-01-09T16:43:45.747 に答える