Как вы можете вызвать функцию создателя экземпляра в Python? - PullRequest
1 голос
/ 21 декабря 2011

У меня есть 2 модуля, каждый из которых содержит класс.
Моя основная программа создает объект класса One, который создает множество объектов класса два.
Мне нужно иметь возможность вызывать функцию в классе One изэкземпляры класса Два.
Это общий вид того, что у меня есть:

module mod_one.py:

import mod_two

class One:
    def __init__(self):
        self.new_instance = Two()

    def call_back_func(self):
        # This function should be called 
        # from the new instance of class Two()

module mod_two.py:

class Two:
    def __init__(self):
        # Call call_back_func() of module mod_one

Единственный способ, который я нашел, - передать функцию обратного вызова call_back_func () в качестве аргумента второму классу следующим образом:

self.new_instance = Two(self.call_back_func)

, но я хотел бы знать, есть ли лучший способ сделать этотот.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Я думаю, что здесь есть компромисс между простотой и слабой связью.На мой взгляд, простота заключается в передаче обратного вызова объекту, в то время как слабая связь будет использовать каркас для передачи сигналов между объектами.

Например, если вы используете blinker signalingВ библиотеке вы можете использовать этот альтернативный дизайн:

from blinker import signal

class One:
    def __init__(self):
        self.two = Two()
        self.two.some_signal.connect(self.callback)

    def callback(self, data):
        print 'Called'

class Two:
    some_signal = signal('some_signal')

    def process(self):
        # Do something                                
        self.some_signal.send()

one = One()
one.two.process()

В приведенном выше коде объект Two даже не знает, существует ли какой-либо другой объект, заинтересованный в его внутренних изменениях состояния.Тем не менее, он уведомляет о них, испуская сигнал, который может использоваться другими объектами (в данном случае One объектом) для выполнения какого-то определенного действия.

Хорошим примером такого подхода является инфраструктура GUI.,Когда создается виджет кнопки, нет необходимости передавать обратный вызов, который должен быть выполнен при нажатии кнопки.Однако кнопка генерирует сигнал, по которому нажали, и любой обратный вызов, подписанный на этот сигнал, выполняется для выполнения желаемого действия.

1 голос
/ 21 декабря 2011

То, что вы делаете, совершенно правильно. Обратите внимание, что __init__ не является конструктором. Это просто метод инициализации. (__new__ - метод конструктора Python)

Больше по этой теме можно найти в вопросе Использование Python __new__ и __init __?

0 голосов
/ 21 декабря 2011

Я думаю, что вам не хватает объекта здесь.В частности, шаблон Creational Builder

class OneTwoBuilder:

  def createOne(self, num_of_two=0):
      o = One()
      child = []
      for _ in xrange(num_of_two):
          t = Two()
          o.callback(t)
          child.append(t)
      o.setChilds(child)
      return o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...