Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Python, память и @classmethod

#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>

Комментариев нет:

Отправить комментарий