[소절자]python에서 같은 키를 갖고 싶은 실례는 하나밖에 없어요.
12205 단어 Python3
목계 알고리즘으로 노드를 공유하고 싶은 경우가 있죠.
다음 그림의 주황색 노드와 같다.
노드를 확장하려면 확장하려는 노드와 같은 노드가 이미 존재하는지도 번거로우니 잘 진행됐으면 좋겠다.
노드에 키를 지정하고 같은 키가 있으면 기존의 실례를 되돌려줍니다. 이렇게 하려면 메타클래스를 사용할 수 있습니다.
# 同じkeyをもつノードは一つにしたい場合
class NodeType(type):
_instances = {}
def __call__(cls, *args, key, **kwargs):
# stateが同じものがあれば、すでに作られたインスタンスを返し、なければ新規作成
if key not in cls._instances:
instance = super(NodeType, cls).__call__(key=key, *args, **kwargs)
cls._instances[key] = instance
return cls._instances[key]
class Node(metaclass=NodeType):
def __init__(self, key, name):
self.key = key
self.name = name
self.id = id(self)
def __repr__(self):
return 'id: {}, name {}, key: {}'.format(self.id, self.name, self.key)
node1 = Node(key=1, name='1'); print(node1)
node2 = Node(key=2, name='2'); print(node2)
node1_2 = Node(key=1, name='1_2'); print(node1_2)
위에서 말한 바와 같이 type을 계승하는 반을 구축하고metaclass를 사용하면 실현할 수 있다.id: 1850359362728, name 1, key: 1
id: 1850359363008, name 2, key: 2
id: 1850359362728, name 1, key: 1
생성된 실례는 키가 관리합니다.NodeType._instances
{1: id: 1850359362728, name 1, key: 1, 2: id: 1850359363008, name 2, key: 2}
시간이 지났어...이 방법으로 NodeTypeinstances에서도 참조가 생길 수 있습니다.
앞으로 약한 참조를 교묘하게 사용해 가비 콜렉션이 원활하게 작동하도록 하는 방법을 연구하고자 합니다.
(2017.12.19 추서)
상술한 방법의 말
del node2
node2_2 = Node(key=2, name='2_2'); print(node2_2)
이렇게 한번 없애고 만들려고 해도id: 1850359363008, name 2, key: 2
name과 id의 정보를 보면 알 수 있듯이 최초로 제작된 실례는 계속되고 있다.NodeType._인스타그램에 참고자료가 남아 있기 때문에 당연하다고 해도 당연할 수 있습니다.
그래서 나는 약한 참조로 이 문제에 대응하고 싶다.
python에서 weakref 라이브러리를 사용하면 약한 참조를 처리할 수 있습니다.
코드는 아래에 쓰겠지만 처음 4줄만 바꿨어요.
from weakref import WeakValueDictionary
# 同じkeyをもつノードは一つにしたい場合
class NodeType(type):
_instances = WeakValueDictionary()
def __call__(cls, *args, key, **kwargs):
# stateが同じものがあれば、すでに作られたインスタンスを返し、なければ新規作成
if key not in cls._instances:
instance = super(NodeType, cls).__call__(key=key, *args, **kwargs)
cls._instances[key] = instance
return cls._instances[key]
class Node(metaclass=NodeType):
def __init__(self, key, name):
self.key = key
self.name = name
self.id = id(self)
def __repr__(self):
return 'id: {}, name {}, key: {}'.format(self.id, self.name, self.key)
node1 = Node(key=1, name='1'); print(node1)
node2 = Node(key=2, name='2'); print(node2)
node1_2 = Node(key=1, name='1_2'); print(node1_2)
NoteType 반에서사전형 대신 instanceWeakValueDictionary를 사용합니다.
id: 1945971777040, name 1, key: 1
id: 1945971777432, name 2, key: 2
id: 1945971777040, name 1, key: 1
이번엔 한번 지우고 다시 만들면del node2
node2_2 = Node(key=2, name='2_2'); print(node2_2)
id: 1945971719192, name 2_2, key: 2
인스턴스가 새로 생성되었는지 확인할 수 있습니다.
Reference
이 문제에 관하여([소절자]python에서 같은 키를 갖고 싶은 실례는 하나밖에 없어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bpzAkiyama/items/66a858c941383a34e496텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)