2013-11-14 3 views
1

engine.py Файл:Делиться значения между объектами в том же модуле Python

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

Потому что событие фактически является подклассом сторонней библиотеки. Кроме того, 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) 

Мой новый модуль также должен работать плавно с существующим кодом, который использует класс событий уже. Поэтому я не могу добавить передать объект движка каждому вызову _process() или в метод init.

+0

Между определениями классов или всеми объектами внутри модуля? –

+0

Между всеми объектами внутри модуля, отредактированным заголовком. – nathancahill

+0

Вы пробовали 'globals() ['variable']'? Но это грязно, я думаю, что в вашей модели дизайна есть проблема. –

ответ

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.

+0

О, хорошо! Вероятно, это лучший вариант. – nathancahill

+0

Но это применимо только в том случае, если вам нужно передать «Событие» в стороннюю библиотеку, которая ** вы все еще не обнаружили **. –

1

«Из-за ограничений, связанных с классом событий (на самом деле это подкласс библиотеки третьей стороной, что я сплайсинга новые функциональные возможности в) Я не могу сделать что-то вроде е = Event (двигатель). "

Похоже, вы обеспокоены тем, что событие наследует какой-либо другой класс, и поэтому вы не можете изменить метод конструктора для этого класса.

Ваш вопрос аналогичен this other one. К счастью, метод 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 
+1

Это помогает, если он создает «Событие». Возможно, что сторонняя lib создает событие из объекта класса, который передается. –

+0

@ Robᵩ: если это так, то OP должен упомянуть об этом. –

+1

Пока единственный разумный ответ ... –

0

Почему бы не передать переменную в функцию process? Вы сказали, что конструктор класса нельзя изменить, но похоже, что вы определяете process. Просто сделайте это:

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

или

def process(self, variable): 
     <do stuff> 
+0

Смотрите мои правки для лучшего объяснения – nathancahill

Смежные вопросы