1

これは奇妙なものです。__init__Python オブジェクトの最後で何らかのアクションを実行したいという状況に何度か遭遇しました。__init__真のクラス(葉のクラス)のみの最後のものとしてアクションを実行したいと思います。__init__セルフメソッドのスーパークラスなら絶対にやりたくない。これを行う良い方法はありますか?私はそれがばかげたことかもしれないと認めます。しかし、それが可能かどうか、またどのように可能かということに興味があります。

4

1 に答える 1

5

いくつかのコードを の最後に__init__、基本クラスで実行せずにリーフ クラスで実行したい場合は、リーフ クラスでオーバーライド__init__するだけです。例えば:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing

のようなメソッド内からプログラムで検出しようとしている場合、 がであるか、または のサブクラスであるBase.__init__かどうか… まあ、通常、これは悪い考えであり、実際には上記のようにメソッドのオーバーライドを使用したいと考えています。しかし、それは簡単に行うことができます。例えば:selfBaseBase

class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing

(誰かがあなたの階層を覆して、そのオブジェクトの でBase なく、そのサブクラスでもないオブジェクトが を呼び出すのではないかと心配している場合Base.__init__、そしてそれが巧妙なモンキーパッチではなく悪いことであると確信している場合は、いつでもできますチェックしてくださいissubclass。)


Base.__init__のようなメソッド内で、 base が「実際のクラス」であるかどうかをプログラムで検出しようとしている場合は、それが何を意味するのかを定義する必要があります。「PEP3119の意味での抽象基本クラスではない」という意味ですか? 「(まだ)定義されたサブクラスはありません」?「いくつかの重要なメソッドの実装がありますか」? あなたがやりたいことはおそらく実行可能ですが、他のものよりも難しいものもあります。(たとえば、誰かがあなたのクラスをサブクラス化したかどうかを検出するには、カスタム メタクラスを作成する必要があります。)

于 2013-03-28T20:06:26.510 に答える