17

Pythonを使用super()してメソッドチェーンを実行する場合は、次のように独自のクラスを明示的に指定する必要があります。

class MyDecorator(Decorator):
    def decorate(self):
        super(MyDecorator, self).decorate()

MyDecoratorの引数としてクラスの名前を指定する必要がありますsuper()。これはDRYではありません。クラスの名前を変更するときは、名前を2回変更する必要があります。なぜこれがこのように実装されているのですか?そして、クラスの名前を2回(またはそれ以上)書く必要がないようにする方法はありますか?

4

4 に答える 4

11

Python 3.0 では、super()which と同等のものを使用できますsuper(ThisClass, self)

ドキュメンテーションはこちら。ドキュメントのコード サンプル:

class C(B):
    def method(self, arg):
        super().method(arg)    
        # This does the same thing as: super(C, self).method(arg)
于 2009-01-21T19:31:04.183 に答える
7

BDFLは同意します。PEP 3135- Python 3.0用の新しいスーパー(およびPep367 -Python2.6用の新しいスーパー)を参照してください。

于 2009-01-21T19:28:33.660 に答える
4

この答えは間違っています。試してください:

def _super(cls):
    setattr(cls, '_super', lambda self: super(cls, self))
    return cls

class A(object):
    def f(self):
        print 'A.f'

@_super
class B(A):
    def f(self):
        self._super().f()

@_super
class C(B):
    def f(self):
        self._super().f()

C().f() # maximum recursion error

Python 2 では、デコレータを使用する方法があります。

def _super(cls):
    setattr(cls, '_super', lambda self: super(cls, self))
    return cls

class A(object):
    def f(self):
        print 'A.f'

@_super
class B(A):
    def f(self):
        self._super().f()

B().f() # >>> A.f
于 2014-08-19T07:19:10.693 に答える
-1

を使用して、古いバージョンの python で具体的なクラス名を記述することを回避することもできます。

def __init__(self):
    super(self.__class__, self)
    ...
于 2009-01-21T20:49:17.320 に答える