[소절자]python에서 같은 키를 갖고 싶은 실례는 하나밖에 없어요.

12205 단어 Python3
pytohon으로 트리 알고리즘을 실현하려면 시간이 없어서 작은 단락을 썼어요.
목계 알고리즘으로 노드를 공유하고 싶은 경우가 있죠.
다음 그림의 주황색 노드와 같다.

노드를 확장하려면 확장하려는 노드와 같은 노드가 이미 존재하는지도 번거로우니 잘 진행됐으면 좋겠다.
노드에 키를 지정하고 같은 키가 있으면 기존의 실례를 되돌려줍니다. 이렇게 하려면 메타클래스를 사용할 수 있습니다.
# 同じ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 반에서사전형 대신 instance
WeakValueDictionary를 사용합니다.
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
인스턴스가 새로 생성되었는지 확인할 수 있습니다.

좋은 웹페이지 즐겨찾기