1

ファイル engine.py:

class Engine(object):
    def __init__(self, variable):
        self.variable = variable

class Event(object):
    def process(self):
        variable = '123'  # this should be the value of engine.variable

パイソン

>>> from engine import Engine, Event
>>> engine = Engine('123')
>>> e = Event()
>>> e.process()

これを達成するための最良の方法は何ですか? Event クラスの制限のため (実際には、新しい機能をスプライシングしているサードパーティ ライブラリのサブクラスです)、次のようなことはできませんe = Event(engine)

詳細な説明:

を使用していないのはなぜe = Event(engine)ですか?

Event は実際にはサードパーティ ライブラリのサブクラスであるためです。また、process()内部メソッドです。したがって、クラスは実際には次のようになります。

class Event(third_party_library_Event):
    def __init__(*args, **kwargs):
        super(Event, self).__init__(*args, **kwargs)

    def _process(*args, **kwargs):
        variable = engine.variable
        # more of my functionality here

        super(Event, self)._process(*args, **kwargs)

また、新しいモジュールは、既に Event クラスを使用している既存のコードとシームレスに実行する必要があります。そのため、エンジン オブジェクトを各 _process() 呼び出しまたはinitメソッドに渡すことはできません。

4

3 に答える 3

1

「Event クラスの制限のため (実際には、新しい機能を接合しているサードパーティ ライブラリのサブクラスです)、e = Event(engine) のようなことはできません。」

Event が他のクラスを継承しているため、クラスのコンストラクター メソッドを変更できないことが懸念されているようです。

あなたの質問は、この他の質問に似ています。幸いなことに、super().__init__()メソッドがこれを行います。

次の例を検討してください。

>>> class C(object):
    def __init__(self):
        self.b = 1


>>> class D(C):
    def __init__(self):
        super().__init__()
        self.a = 1

>>> d = D()
>>> d.a
1
>>> d.b  # This works because of the call to super's init
1
于 2013-11-14T19:28:25.893 に答える
1

functools.partial役立つかもしれません:

#UNTESTED
class Engine(object):
    def __init__(self, variable):
        self.variable = variable

class Event(object):
    def __init__(self, engine):
        super().__init__()
        self.engine = engine
    def process(self):
        print self.engine.variable


engine = Engine('123')
Event = functools.partial(Event, engine)

ThirdPartyApiThatNeedsAnEventClass(Event)

これで、サードパーティ ライブラリがイベントを作成すると、自動的に渡されengineます。

于 2013-11-14T19:39:51.210 に答える
0

process変数を関数に渡さないのはなぜですか? クラスのコンストラクターは変更できないとおっしゃいましたが、 を定義しているようですprocess。それを作るだけです:

    def process(self, engine):
        variable = engine.variable
        <do stuff>

また

    def process(self, variable):
        <do stuff>
于 2013-11-14T19:34:58.307 に答える