Процесс создания экземпляра класса

kevin wong спросил: 28 апреля 2018 в 08:21 в: python

Как показано на рисунке:

pic1

In [1]: from datetime import datetimeIn [2]: class A(object):
   ...:     now = datetime.now()
   ...:     def __init__(self):
   ...:         pass
   ...:     def p(self):
   ...:         print(self.now)
   ...:In [3]: datetime.now()
Out[3]: datetime.datetime(2018, 5, 22, 17, 54, 4, 593295)In [4]: a_1 = A()In [5]: a_1.p()
2018-05-22 17:53:57.597022In [6]: datetime.now()
Out[6]: datetime.datetime(2018, 5, 22, 17, 54, 29, 177489)In [7]: a_2 = A()In [8]: a_2.p()
2018-05-22 17:53:57.597022

Я не могу понять, как Python инициализирует переменную класса и почему я создал два объекта класса , но значения переменных класса этих двух классов одинаковы?

Благодарим за помощь.

2 ответа

Есть решение
Nicolò Gasparini ответил: 28 апреля 2018 в 08:28

Вы должны использовать now = datetime.now () в методе инициализации (init), например:

class A(object):
    def __init__(self):
        self.now = datetime.now()
    def p(self):
        print(self.now)

В вашем коде этот метод вызывается только тогда, когда класс сначала инициализируется, а не когда объект определен.

Paula Thomas ответил: 28 апреля 2018 в 08:36

Комментарий @Mike Scotty верен, но для ясности требуется расширение.

Когда переменная устанавливается без self. перед ним в классе класса есть переменные класса, они будут иметь одинаковое значение во всех экземплярах класса. Если вы хотите, чтобы переменные, зависящие от экземпляра, вам нужно инициализировать их в рамках метода, предпочтительно init и предшествовать имени "я".

Итак, ваше определение класса должно читать:

class A(object):
    def __init__(self):
        self.now = datetime.now()
    def p(self):
        print(self.now)
kevin wong ответил: 28 апреля 2018 в 08:40
Я понимаю, что вы имеете ввиду. Спасибо. Кроме того, я хотел бы подтвердить, что переменные класса инициализируются во время определения класса, а не инициализируются при создании объектов класса. Это правильно?
Goyo ответил: 28 апреля 2018 в 08:52
@kevinwong Эти ребята на python.org ara изумились при написании документов, вы должны дать им шанс.
Paula Thomas ответил: 28 апреля 2018 в 09:28
@kevinwong Зависит от того, какие переменные вы имеете в виду. Переменные экземпляра необходимо инициализировать, когда экземпляр. Другие переменные? Когда экземпляр создается, сначала происходят две вещи, и создается новый указатель экземпляра, а второй - это вызов класса init и all код в нем выполняется. Таким образом, это зависит от того, где задана переменная класса.