2

Dill パッケージでさらに作業を進めます。昨日投稿されたのは、リファレント、リファラー、継承、およびコンテナーに関する無知の例です。答えは洞察に満ちていましたが、リファラーとリファレント チェーンのいくつかのレベルの深さを示す例を思いつくのにまだ苦労しています。

昨日、私はそれがそのクラスにinstanceなるだろうと思っていました。referrerディルのドキュメントではchildrenreferrerであるため、その場合のchildgrandchilddepth=2になりますよね? そして、それは、別のものを参照する別のものを参照する(指し示す)でしょうか?objectobjectobject

少なくとも 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は文字列「ヘンリエッタ エンシェント ワン」です。

And the referrers (Children) (result of gc.get_referrers(), filtered by specified object-type) contains two objects: A list that includes the string 'Henrietta Ancient One', and the string Henrietta Ancient One. (depth=2 and depth=1 return the same result.)

How can I make an object for which Dill can return:

  1. Two distinct depths of referrers
  2. Two distinct depths of referents
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__、クラス メソッドまたは属性のいずれかを検索します。したがって、含まれるメソッドまたは関数はすべて深さ = 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'>]
于 2014-10-18T14:13:42.637 に答える