Изменение адреса на «self» объект в python не повлияет на созданный для него объект - PullRequest
0 голосов
/ 18 января 2019

Этот код изменяет адрес собственного объекта на начальный адрес объекта в функции инициализации с последующей инициализации объекта. Но это фактически создает новый адрес для созданного объекта. Я понимаю, что самообслуживание только во время выполнения функции инициализации. Мой вопрос: после того, как метод init завершает выполнение, он возвращает что-нибудь?


class A:
 addr = None
 def __init__(self):
  if A.addr:
   print("Current object address:",id(self))
   print("First object address:",id(A.addr))
   self = A.addr
   print("Current object address after modification:",id(self))
  else:
   print("Initial address",id(self))
   A.addr = self

>>> a = A()
Initial address 2433753170104
>>> b = A()
Current object address: 2433753170216
First object address: 2433753170104
Current object address after modification: 2433753170104
>>> id(a),id(b)
(2433753170104, 2433753170216)

1 Ответ

0 голосов
/ 18 января 2019

Расширение моего комментария - если вы хотите, чтобы конструктор всегда возвращал один и тот же экземпляр (это называется singleton), используйте конструктор __new__, например:

class Singleton:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance


s1 = Singleton()

s2 = Singleton()

s1 is s2  # --> True  (this is the same as id(s1) == id(s2))
...