0

Python でスーパークラスのメソッドを呼び出す最良の方法は、次のように書くことだと理解しています。

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

ただし、これは、クラス Foo の名前を変更するか、別のクラスのコードをカット アンド ペーストする場合、スーパー クラスのメソッドを呼び出す行を変更することを覚えておく必要があることを意味します。これを回避する方法はありますか?少なくとも煩わしく、最悪の場合は非常にエラーが発生しやすくなります。

4

2 に答える 2

1

Python 3 では、書くことができsuper()、それがクラスを埋めてくれます。

Python 2 では、クラスの名前を記述する必要があります。しかし、クラスの名前を変更することは、それほど一般的な操作ではないため、それほど苦労しているとは思いません。クラスの名前を変更する場合は、クラスの名前を検索して置換することを覚えておく必要がありますが、そのサブクラスも名前で参照するため、おそらくそれを行う必要があります。

于 2012-04-21T20:51:39.937 に答える
0

誰にとっても簡単で、安全で、簡単に理解できる方法を意味しますか (super() に関する限り)?

短い答え:いいえ。

長い答え: はい。それにはいくつかの方法があります。そのうちの 1 つは、メタクラスを使用して、クラスの初期化中に super() の作成を自動化することです。

>>> class AutoSuper(type):
...     def __init__(cls, name, bases, dict):
...         super(AutoSuper, cls).__init__(name, bases, dict)
...         setattr(cls, '_%s__super'%name, super(cls))
... 
>>> 

そのため、作成中のクラスへの super() 呼び出しは __super 属性に割り当てられます。名前マングリングは手動で行う必要がありますが、インスタンスとサブクラスはそれに応じてヒットします。これで、super を呼び出す必要さえなくなりました。__super 属性を使用するだけです。

>>> class A(object):
...     __metaclass__ = AutoSuper
...     def m(self):
...         print 'A'
... 
>>> 
>>> class B(A):
...     def m(self):
...         print 'B'
...         self.__super.m()
... 
>>> 
>>> class C(B):
...     def m(self):
...         print 'C'
...         self.__super.m()
... 
>>> obj = C()
>>> obj.m()
C
B
A
>>> 

もちろん、これは学習目的でのみ投稿しているので、使用はお勧めしません。これは、一部の人が Python で非難する過剰な賢さの境界線にあるようなものです。

于 2012-04-21T22:15:07.620 に答える