Heim  >  Artikel  >  Backend-Entwicklung  >  python 图 自身遍历及弱引用使用

python 图 自身遍历及弱引用使用

高洛峰
高洛峰Original
2016-10-19 16:43:321298Durchsuche

在【python 标准库】中看到的一段代码,非常有帮助:

def all_nodes(self):
        yield self
        n = self.other
        while n and n.name != self.name:
            yield n
            n = n.other
        if n is self:
            yield n
        return

   


首尾的2处yield均只返回一次,作为循环图的起点、终点,而n作为图可能的节点,每次在next调用中均返回next节点

利用这个迭代器,就可以轻松打印出图的结构:

def __str__(self):

       return '->'.join((n.name for n in self.all_nodes()))


Graph:

one->two->three->one


实现一个图结构需要利用python里面的弱引用,

我们先看一下标准的向图结构中增加下一节点的代码:

def set_next(self, other):

       print '%s.next %r' % ( self.name, other)

       self.other = other


这样绑定后,在属性字段中,增加一个对于下一节点的引用

c.__dict__

{'other': , 'name': '1'}


所以,即使手动调用了 a = None, b = None, c = None,对象也不会被删除

Garbage:[,

,

,

{'name': 'one', 'other': },

{'name': 'two', 'other': },

{'name': 'three', 'other': }]

而弱引用是指“引用一个对象,但并不增加被引用对象的指针计数”

可以通过c = weekref.ref(k,func)  

来指定引用的对象及对象删除后的动作func

调用时,使用c() 来引用k

但是在上个例子里面,我们需要一个“代理对象”来代理这个被引用的对象,从而使set_next 函数对于变量other可以同正常变量一样使用

def set_next(self, other):
        if other is not None:
            if self in other.all_nodes():
                other = weakref.proxy(other)
        super(WeakGraph, self).set_next(other)
        return

   


从而避免了通过other()来引用一个other对象~


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:python全局变量Nächster Artikel:Python - 命名规范