Если вы просто вызовете конструктор класса и не назначите результат переменной, ссылка не будет создана.Даже сборщик мусора не знает об экземпляре этого класса.
import gc
class myClass:
pass
myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a
gc.disable() # even disabling the garbage collector will not make a difference
myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
Вывод:
[] []
['a'] [<__main__.myClass object at 0x00000000046026D8>]
[] []
Однако вы можете заставить класс самостоятельно отслеживать ссылки:
import gc
class myClass:
ref = []
def __init__(self):
myClass.ref.append(self)
myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a
gc.collect() # force garbage collection
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
Вывод:
[] [<__main__.myClass object at 0x00000000048226D8>]
['a'] [<__main__.myClass object at 0x00000000048226D8>, <__main__.myClass object at 0x0000000004890860>]
[] [<__main__.myClass object at 0x0000000004890860>, <__main__.myClass object at 0x00000000048226D8>]
Примечание: таким образом, сборщик мусора никогда не удаляет экземпляры этого класса, даже если переменная удаляется, до тех пор, покапоскольку класс хранит ссылку на экземпляр!