Вопрос про пространство имен в ООП

Есть класс:

class Person:
    name="Anna"
    info = {"Имя": name}

я изменяю атрибута класса name на "Billy"

Person.name="Bully"

но когда я обращаюсь к атрибуту info (словарь)

print(Person.info), то получаю: {'Имя': 'Anna'}

Почему в словаре Anna, а не Billy? Ведь атрибут name="Billy"? И как это исправить?

UPD: Более того:

print(id(Person.name)) #id=4330356912
print(id(Person.info['Имя'])) #id=4330356784

Айдишники разные. Почему они ссылаются на разные объекты??


Ответы (1 шт):

Автор решения: maestro

Данная проблема заключается скорее в том что у вас нет экземпляров класса, все атрибуты вашего класса являются статичными и должны меняться явно

Это можно обойти определив метод класса, который будет менять атрибуты класса Например:

class Person:
    name="Anna"
    info = {"Имя": name}

    def change_name(name):
      Person.name = name
      Person.info['Имя'] = name

Person.change_name("Bill")
print(Person.name) # "Bill"
print(Person.info) #  {"Имя": "Bill"}

Но я бы все же создал класс который будет иметь экземпляры

class Person:

    def __init__(self,name):
        self.name = name

    def get_info(self):
        return {"Имя": self.name}

obj = Person("Anna")
print(obj.name) # "Anna"
print(obj.get_info()) # {"Имя": "Anna"}

obj.name = "Bill"
print(obj.name) # "Bill"
print(obj.get_info()) #{"Имя": "Bill"}

Атрибут self указывает на конкретный экземпляр класса, в данном случае экземпляр мы его определили в переменную obj

Тем самым вы можете создавать несколько несвязанных между собой экземпляров одного класса

→ Ссылка