Python 3.0+では使用できることが注目されています
super().__init__()
これは簡潔であり、親またはクラス名を明示的に参照する必要がないため、便利です。Python 2.7以下で追加したいのですself.__class__
が、クラス名の代わりに書くことで、名前を区別しない動作を実装する人もいます。
super(self.__class__, self).__init__() # DON'T DO THIS!
ただし、これにより、子クラスを返す可能性super
のあるクラスから継承するクラスの呼び出しが中断されます。self.__class__
例えば:
class Polygon(object):
def __init__(self, id):
self.id = id
class Rectangle(Polygon):
def __init__(self, id, width, height):
super(self.__class__, self).__init__(id)
self.shape = (width, height)
class Square(Rectangle):
pass
ここにSquare
、 のサブクラスである クラス がありRectangle
ます。Square
forのコンストラクターでRectangle
十分なため、別のコンストラクターを作成したくないとしますが、何らかの理由で Square を実装して、他のメソッドを再実装できるようにしたいとします。
Square
usingを作成すると、独自のコンストラクターを指定していないためmSquare = Square('a', 10,10)
、Python はコンストラクターを呼び出します。ただし、 のコンストラクターでは、呼び出しは のスーパークラスを返すため、コンストラクターを再度呼び出します。@S_Cで言及されているように、これが無限ループの発生方法です。この場合、実行時にコンストラクターを呼び出していますが、引数を指定しないため、エラーが発生します。Rectangle
Square
Rectangle
super(self.__class__,self)
mSquare
Rectangle
super(...).__init__()
Rectangle