2

进一步使用Dill 包。昨天发布的例子说明了对参照物、参照物、继承和容器的一些无知。答案很有见地,但我仍然无法想出一些例子来显示引用者和引用者链中的几个层次的深度。

昨天我在想那instance会是referrer它的班级。在 Dill 文档中, childrenreferrers,所以在这种情况下,一个child ofdepth=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_parent是字符串“Henrietta Ancient One”。

引用者(Children)(的结果,gc.get_referrers()按指定对象类型过滤)包含两个对象:list包含字符串“Henrietta Ancient One”的 A 和stringHenrietta Ancient One。(depth=2 和 depth=1 返回相同的结果。)

如何制作 Dill 可以返回的对象:

  1. 两种不同深度的推荐人
  2. 两种不同深度的参照物
4

1 回答 1

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__来查找任何类方法或属性。因此,任何包含的方法或函数都位于 depth=3(而不是 depth=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'>]
于 2014-10-18T14:13:42.637 回答