65 lines
1.3 KiB
Python
65 lines
1.3 KiB
Python
|
|
#!/usr/bin/env python
|
||
|
|
# -*- encoding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
Topic: 弱引用
|
||
|
|
Desc :
|
||
|
|
"""
|
||
|
|
|
||
|
|
import weakref
|
||
|
|
|
||
|
|
|
||
|
|
class Node:
|
||
|
|
def __init__(self, value):
|
||
|
|
self.value = value
|
||
|
|
self._parent = None
|
||
|
|
self.children = []
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
return 'Node({!r:})'.format(self.value)
|
||
|
|
|
||
|
|
# property that manages the parent as a weak-reference
|
||
|
|
@property
|
||
|
|
def parent(self):
|
||
|
|
return None if self._parent is None else self._parent()
|
||
|
|
|
||
|
|
@parent.setter
|
||
|
|
def parent(self, node):
|
||
|
|
self._parent = weakref.ref(node)
|
||
|
|
|
||
|
|
def add_child(self, child):
|
||
|
|
self.children.append(child)
|
||
|
|
child.parent = self
|
||
|
|
|
||
|
|
|
||
|
|
# Class just to illustrate when deletion occurs
|
||
|
|
class Data:
|
||
|
|
def __del__(self):
|
||
|
|
print('Data.__del__')
|
||
|
|
|
||
|
|
|
||
|
|
# Node class involving a cycle
|
||
|
|
class Node1:
|
||
|
|
def __init__(self):
|
||
|
|
self.data = Data()
|
||
|
|
self.parent = None
|
||
|
|
self.children = []
|
||
|
|
|
||
|
|
def add_child(self, child):
|
||
|
|
self.children.append(child)
|
||
|
|
child.parent = self
|
||
|
|
|
||
|
|
|
||
|
|
a = Data()
|
||
|
|
del a
|
||
|
|
# print(a) NameError: name 'a' is not defined
|
||
|
|
a = Node1()
|
||
|
|
del a
|
||
|
|
# print(a)
|
||
|
|
a = Node1()
|
||
|
|
a.add_child(Node1())
|
||
|
|
print('--------last del start------------')
|
||
|
|
del a # Not deleted (no message)
|
||
|
|
print('--------last del end------------')
|
||
|
|
# print(a)
|
||
|
|
print('11111111111111111')
|