Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2021 08:58:16

d0dger
Зарегистрирован: 2021-07-19
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

непонятка с наследованием

Имеется некий базовый класс:

 class MyClass:
    var_one = 'class '
    var_two = ['class']
    var_three = ['', '']
    def __init__(self):
        pass

И два дополнительных класса, наследуемых от базового:
 class OneClass(MyClass):
    def __init__(self):
        self.var_one += ' One'
        self.var_two.append('One')
        self.var_three[0] = 'One'
 class TwoClass(MyClass):
    def __init__(self):
        self.var_one += ' Two'
        self.var_two.append('Two')
        self.var_three[1] = 'Two'

Создаются два объекта класса:
 classOne = OneClass()
 classTwo = TwoClass()

И вот тут возникает вопрос, почему атрибут строкового типа var_one ведет себя предсказуемо, а атрибуты типа списка var_two и var_three принимают непонятные (для меня) значения:
 print(classOne.var_one) > class One
 print(classOne.var_two) > ['class', 'One', 'Two']
 print(classOne.var_three) > ['One', 'Two']

Откуда в объекте classOne появляются значения из класса TwoClass?

Офлайн

#2 Июль 19, 2021 11:32:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

непонятка с наследованием

Переменные надо создавать внутри метода __init__(), а не внутри класса за пределами методов. Тогда у каждого экземпляра эти переменные будут создаваться заново.



Офлайн

#3 Июль 19, 2021 12:40:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

непонятка с наследованием

> а атрибуты типа списка var_two и var_three принимают непонятные (для меня) значения

Они существуют в пространстве имён класса. По этому они будут общими для всех его экземпляров.
P.S. Изменяемыми типами нужно пользоваться с осторожностью, часто их случайное изменение влечёт сложнообнаруживаемые ошибки.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version