2014-09-04 46 views
2

继续使用Dill package进行工作。昨天发布了一些例子ignorance of referents, referrers, inheritance and containers。答案很有洞察力,但我仍然无法提出一些例子,这些例子在推荐人和指称链中显示出几个层次的深度。指示物链的示例,推荐人

昨天我在想,instance将是一个referrer到它的类。在迪尔文档孩子引荐,所以在这种情况下,孩子的depth=2将是一个孙子,对不对?那是object是指(点)到另一个object那是指另一个object

将是什么,其具有的所指引荐至少两个深度的链的对象的一个​​例子?

考虑:

import dill 

class GreatGrandparentClass(object): 
    """A Great Grandparent class""" 

    name = "Henrietta Ancient One" 

class GrandparentClass(GreatGrandparentClass): 
    """A Grandparent class""" 

class ParentClass(GrandparentClass): 
    """A Grandparent class""" 

great_grand_parent = ParentClass().name 

print ("Children (depth=2):") 

for element in dill.detect.children(
         great_grand_parent, 
         list, 
         depth=2, 
         ignore=(globals())): 
    print(element) 

print ("Parents:") 
for element in dill.detect.parents(      
         great_grand_parent, 
         list, 
         depth=2, 
         ignore=(globals())): 
    print(element) 

回报:

Children (depth=2): 
['\npython pydill.py\n\n', 'dill', 'object', 'A Great Grandparent class', 'i', 'Henrietta Ancient One', 'GreatGrandparentClass', 'GreatGrandparentClass', 'A Grandparent class', 'GrandparentClass', 'GrandparentClass', 'A Grandparent class', 'ParentClass', 'great_grand_parent', 'ParentClass', 'i', 'Children (depth=2):', 'element', 'dill', 'detect', 'children', 'great_grand_parent', 'list', 'depth', 2, 'ignore', 'globals', 'element', 'Parents:', 'element', 'dill', 'detect', 'parents', 'great_grand_parent', 'list', 'depth', 2, 'ignore', 'globals', 'element'] 
Henrietta Ancient One 
Parents: 
Henrietta Ancient One 

list对象明确看这里的great_grand_parentreferrent(家长)是字符串, “亨丽埃塔远古邪神”。

引荐(儿童)(的gc.get_referrers()结果,由指定的对象类型的过滤)包含两个对象:甲list包含字符串“亨丽埃塔古老一个”和string亨丽埃塔古老一个。 (深度= 2和深度= 1点返回相同的结果。)

我怎样才能使一个对象为其莳萝可以返回:引荐的

  1. 两个不同的深度
  2. 两个所指
  3. 的不同深度

回答

1

这里的孩子和家长们的一个例子,这可能是在第一次有点令人惊讶,如果你不熟悉Python是如何建立的类实例...

我们构造一个类,并尝试从类的实例中获取方法foobar

>>> class Dummy(object): 
... def foobar(self, x): 
...  return x**2 + 1 
... 
>>> me = Dummy() 
>>> import types 
>>> dill.detect.parents(me, types.MethodType, depth=2) 
[<__main__.Dummy object at 0x105173890>] 
>>> dill.detect.parents(me, types.FunctionType, depth=2) 
[<__main__.Dummy object at 0x105173890>] 

它似乎不工作......但实际上,这是由于python如何构建类实例。事实证明,类实例指向类...但是从那里,类实例使用类__dict__来查找任何类方法或属性。因此,任何包含的方法或函数的深度= 3(而不是深度= 2)。

>>> dill.detect.parents(me, types.FunctionType, depth=3) 
[<__main__.Dummy object at 0x106b94750>, <class '__main__.Dummy'>, {'__dict__': <attribute '__dict__' of 'Dummy' objects>, 'foobar': <function foobar at 0x106b8ed70>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Dummy' objects>, '__doc__': None}, <function foobar at 0x106b8ed70>] 

现在,采取另一种方式非常符合您对使用类继承的想法。

>>> class Dummy2(Dummy): 
... pass 
... 
>>> alsome = Dummy2() 
>>> dill.detect.children(Dummy, type(alsome), depth=2) 
[<__main__.Dummy2 object at 0x105d6d390>, <class '__main__.Dummy2'>, <class '__main__.Dummy'>]