@neiroman2k

Почему тип dict не изолируется внутри класса?

Есть два класса A и B которые наследуют класс Interface.
Подразумевается, что в классах A и B данные, унаследованные из Interfaces будут изолированы.
Это так, но только не относится к переменной b имеющей тип dict - при изменении ее внутри класса A эти изменения видны и в классе B

class Interface:
    a = 1
    b = dict()
    c = []

class A(Interface):
    def __init__(self):
        self.a = 2
        self.b['a'] = 'a'
        self.c = [1,2,3]

class B(Interface):
    def __init__(self):
        print('B(a)=', self.a)
        print('WTF ??  B(b)=', self.b)
        print('B(c)=', self.c)

a = A()
b = B()

Результат удивительный - изменение A.b повлекло изменение B.b, хотя B.a и B.c не изменились
B(a)= 1
WTF ??  B(b)= {'a': 'a'}
B(c)= []


Если же завернуть b во вложенный класс, то все нормально
class Interface:
    a = 1
    b = {}
    c = []
    d = None

    class __S__:
        b = {}

    def __init__(self):
        self.d = self.__S__()

class A(Interface):
    def __init__(self):
        super().__init__()
        self.a = 2
        self.b['a'] = 'a'
        self.c = [1,2,3]
        self.d.b = 'a'

class B(Interface):
    def __init__(self):
        super().__init__()
        print('B(a)=', self.a)
        print('WTF ??  B(b)=', self.b)
        print('B(c)=', self.c)
        print('B(d.b)=', self.d.b)

a = A()
b = B()


Результат уже такой как надо - B.d изолирован от A.d
B(a)= 1
WTF ??  B(b)= {'a': 'a'}
B(c)= []
B(d.b)= {}
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
class Interface:
    a = 1
    b = dict()
    c = []

Ты описал класс с тремя атрибутами класса. Не экземпляра, а именно класса.
Три атрибута экземпляра описываются как
class Interface:
    def __init__(self):
        self.a = 1
        self.b = dict()
        self.c = []

А если тебе нужен эквивалент интерфейсов, почитай про typing.Protocol.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы