Совместное использование базового класса между двумя производными классами в Python - PullRequest
0 голосов
/ 29 апреля 2018

В этой ситуации класс A является родителем классов B и C. Цель - разделить состояние между экземплярами b и c. Речь идет не о добавлении или переопределении функций, а о значении состояния a.

 class A():
     def __init__(self):
         self.a ='a'
         print('@a')
 class B(A):
     def __init__(self):
         A.__init__(self)
         self.x = 'b'
 class C(A):
     def __init__(self):
         A.__init__(self)
         self.x = 'c'

 b = B()
 c = C()
 print(b.a, b.x)
 print(c.a, c.x)

Выход

 @a
 @a
 a b
 a c

Я понимаю, почему это происходит; __init__() в А вызывается дважды. Я мог бы поставить тест, чтобы он устанавливал начальное значение только один раз, но это не кажется очень элегантным решением. Кроме того, он позволяет использовать только один экземпляр A. Если я хочу, чтобы другой экземпляр A был разделен между двумя другими экземплярами B и C, это невозможно сделать. То же самое касается создания a глобального внутри модуля и полного избавления от класса А. Есть ли хороший Pythonic способ решить эту проблему?

1 Ответ

0 голосов
/ 30 апреля 2018

Согласиться с abarnert: это не имеет никакого смысла. Это не то, что означает наследование.

Наследование означает, что каждый экземпляр B является экземпляром A, а каждый экземпляр C является экземпляром A. Экземпляр B не имеет отдельного экземпляра A и, конечно, не может делиться с экземпляром C.

Если вы хотите, чтобы объекты B и C имели экземпляр A и имели такой же A экземпляр, то вам нужна композиция:

class A(object):
    def __init__(self):
        self.state = whatever()
        self.other_state = more_stuff()

class B(object):
    def __init__(self, a):
        self.a = a

class C(object):
    def __init__(self, a):
        self.a = a

a = A()
b = B(a)
c = C(a)

Теперь b и c совместно используют один экземпляр A, и изменения в этом общем экземпляре будут видны через оба объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...