1

文件引擎.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

Python

>>> 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)

现在,当第 3 方库创建 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 回答