gpt4 book ai didi

python - 引用链、引用者链的示例

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:51 24 4
gpt4 key购买 nike

进一步使用 Dill package .昨天发布,举例说明了一些 ignorance of referents, referrers, inheritance and containers .答案很有见地,但我仍然无法想出显示引荐来源网址和指称链中几个深度级别的示例。

昨天我在想一个instance 将是一个referrer 到它的类。在 Dill 文档中,childrenreferrers,因此在这种情况下,depth=2child 将是孙子,对吧?那会是一个对象引用(指向)另一个对象,而这个对象又引用另一个对象吗?

什么是具有至少两个深度的referentsreferrers 链的对象示例?

考虑:

 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(父级)是字符串“Henrietta Ancient One”。

referrers(子级)(gc.get_referrers() 的结果,按指定的对象类型过滤)包含两个对象:列表 包含字符串 'Henrietta Ancient One' 和 string Henrietta Ancient One。 (depth=2 和 depth=1 返回相同的结果。)

如何创建 Dill 可以返回的对象:

  1. 两个不同深度的推荐人
  2. 两个不同深度的指涉对象

最佳答案

这是一个 child 和 parent 的例子,如果你不熟悉 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'>]

关于python - 引用链、引用者链的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25674886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com