2015-03-03 3 views
4
Class BigClassA: 
     def __init__(self): 
      self.a = 3 
     def foo(self): 
      self.b = self.foo1() 
      self.c = self.foo2() 
      self.d = self.foo3() 
     def foo1(self): 
      # do some work using other methods not listed here 
     def foo2(self): 
      # do some work using other methods not listed here 
     def foo3(self): 
      # do some work using other methods not listed here 

    Class BigClassB: 
     def __init__(self): 
      self.b = # need value of b from BigClassA 
      self.c = # need value of c from BigClassA 
      self.d = # need value of d from BigClassA 
     def foo(self): 
      self.f = self.bar() 
     def bar(self): 
      # do some work using other methods not listed here and the value of self.b, self.c, and self.d 


    Class BigClassC: 
     def __init__(self): 
      self.b = # need value of b from BigClassA 
      self.f = # need value of f from BigClassB 
     def foo(self): 
      self.g = self.baz() 
     def baz(self): 
      # do some work using other methods not listed here and the value of self.b and self.g 

Вопрос: В принципе у меня есть 3 класса с большим количеством методов, и они несколько зависимы, как вы можете видеть из кода. Как передать значение переменных экземпляра self.b, self.c, self.d из BigClassA в BigClassB?Python: как делиться данными между экземплярами разных классов?

nb: эти 3 класса не могут быть унаследованы друг от друга, так как это не имеет смысла.

Что я имею в виду, это просто объединение всех методов в супер большой класс. Но я не считаю, что это правильный способ сделать это.

+0

класс 'BigClassB (BigClassA):' и 'класс BigClassC (BigClassA, BigClassB)'. Использование наследования – ForceBru

+1

Вы можете попробовать использовать композицию. То есть, когда вы создаете объект класса A внутри экземпляра класса B. Таким образом, у вас есть соединение, не говоря о том, что оно является специализацией другого. [Читать здесь] (http://learnpythonthehardway.org/book/ex44.html). Кроме этого, вы можете отправить объект класса A и оценить атрибут, который вам нужен, новому атрибуту в классе B. Хотя это может нарушить согласованность данных. – ljetibo

+0

Вы хотите поделиться данными на экземпляр класса или глобально? –

ответ

5

Вы верны, в вашем случае наследование не имеет смысла. Но, как о явной передаче объектов во время создания. Это будет иметь большой смысл.

Что-то вроде:

Class BigClassA: 
    def __init__(self): 
     .. 
Class BigClassB: 
    def __init__(self, objA): 
     self.b = objA.b 
     self.c = objA.c 
     self.d = objA.d 

Class BigClassC: 
    def __init__(self, objA, objB): 
     self.b = objA.b # need value of b from BigClassA 
     self.f = objB.f # need value of f from BigClassB 

Хотя инстанцировании, сделайте следующее:

objA = BigClassA() 
.. 
objB = BigClassB(objA) 
.. 
objC = BigClassC(objA, objB) 
+0

Интересно, что это за дизайн или образец? Это обычная вещь или есть лучший способ решить проблему? –

+1

@ user74158 это может быть слишком распространено даже для того, чтобы иметь имя. –

+1

@ user74158 Это не шаблон дизайна или что-то еще. Его просто стандартное средство достижения того, что вы хотели бы сделать. Идея состоит в том, чтобы установить явные зависимости, передав зависимые объекты в '__init__'. – SuperSaiyan

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