#python #классы
class Person: def __init__(self, name, age): self.name = name self.age = age # a class method to create a Person object. @classmethod def fromBirthYear(cls, name, age): return cls(name, age) #это специально так чтобы было видно адрес в памяти person1 = Person('Ctac', 16)#создаём первую переменную класса print("person_1= ", person1)#выводим информацию о ней print("@classmethod(after ini person1)= ", Person.fromBirthYear('Stas', 45))#используем декоратор @classmethod print("@classmethod(after ini person1)= ", Person.fromBirthYear('Bob', 15))#используем декоратор @classmethod person2 = Person('Jhon', 45)#создаём вторую переменную класса print("person_2= ", person2)#выводим информацию о ней print("@classmethod(after ini person2)= ", Person.fromBirthYear('Serge', 245)) print("@classmethod(after ini person2)= ", Person.fromBirthYear('Bill', 715)) person3 = Person('Vova', 345)#создаём третью переменную класса print("person_3= ", person3)#выводим информацию о ней person4 = Person('Alis', 145)#создаём четвёртую переменную класса print("person_4= ", person4)#выводим информацию о ней print("@classmethod(after ini person4)= ", Person.fromBirthYear('Alis', 315)) print("@classmethod(after ini person4)= ", Person.fromBirthYear('Albert', 125)) person5 = Person('Max', 445)#создаём четвёртую переменную класса print("person_5= ", person5)#выводим информацию о ней в консоле получаем такой результат: person_1=@classmethod(after ini person1)= @classmethod(after ini person1)= person_2= @classmethod(after ini person2)= @classmethod(after ini person2)= person_3= person_4= @classmethod(after ini person4)= @classmethod(after ini person4)= person_5= Process finished with exit code 0 Вопрос: почему при создании первого объекта он в памяти по своему адресу, потом я вызываю @classmethod после создаю второй объект класса. Так вот @classmethod ссылается на тот же блок в памяти, что и второй объект? Специально я потом ещё несколько подобных манипуляций сделал - @classmethod ссылается на блок в памяти созданный следующим экземпляром класса. А мне думалось, что @classmethod всегда будет ссылаться на один и тот же блок памяти. Спасибо!
Ответы
Ответ 1
Дело не в использовании @classmethod, а в том, что создавая объект с помощью конструктора, вы сохраняете ссылку на него в переменную, что не позволяет этот объект сразу уничтожить. А результат вызова fromBirthYear сразу передается в print, после этого становится ненужным и потенциально может быть уничтожен. Его место может занять следующий создаваемый объект, что и происходит. Если сохранять ссылки на создаваемые объекты, результат будет соответствовать ожиданим. person1 = Person('Ctac', 16)#создаём первую переменную класса print("person_1= ", person1)#выводим информацию о ней person11 = Person.fromBirthYear('Stas', 45) #используем декоратор @classmethod person12 = Person.fromBirthYear('Bob', 15) #используем декоратор @classmethod print("@classmethod(after ini person1)= ", person11) print("@classmethod(after ini person1)= ", person12) person_1= <__main__.Person object at 0x7f591d888208> @classmethod(after ini person1)= <__main__.Person object at 0x7f591d888240> @classmethod(after ini person1)= <__main__.Person object at 0x7f591d888278>
Комментариев нет:
Отправить комментарий