Вопрос про пространство имен в ООП
Есть класс:
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 шт):
Данная проблема заключается скорее в том что у вас нет экземпляров класса, все атрибуты вашего класса являются статичными и должны меняться явно
Это можно обойти определив метод класса, который будет менять атрибуты класса Например:
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
Тем самым вы можете создавать несколько несвязанных между собой экземпляров одного класса