与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可以返回的对象:
答案 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'>]