引用链,引用者的示例

时间:2014-09-04 20:58:24

标签: python reference dill

Dill package进一步合作。昨天发布了一些例证ignorance of referents, referrers, inheritance and containers。答案很有见地,但我仍然难以提出在引用者和引用链中显示几个深度的例子。

昨天我认为instance对于它来说是referrer。在Dill docs children 中是 referrers ,因此在这种情况下,depth=2将是孙子< / em>,对吗?那会是object 引用(指向)另一个object引用另一个object吗?

具有至少深度为2的指示引用链的对象的示例是什么?

考虑:

 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的单个 referrent (Parent)是字符串,“Henrietta Ancient One”。

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

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

  1. 两个不同深度的推荐人
  2. 两个不同深度的指称

1 个答案:

答案 0 :(得分: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'>]