4

私はPythonで次のようなことができることを知っています:

from weakref import ref

class A(object):
    def __init__(self, parent):
        self._parent = ref(parent)

    @property
    def parent(self):
        return self._parent()

a = A(some_other_object)
print a.parent

この架空の状況では、適切な方法でA弱参照parentオブジェクトのインスタンスを作成してアクセスします。ただし、弱参照プロパティごとに 4 行のコードは少し多いようです。

上記のショートカットとして、次のようなことができると思いました。

class A(object):
    def __init__(self, parent):
        self.parent = property(ref(parent))

ただし、これは親オブジェクトを返すのではなく、propertyオブジェクトを返します。呼び出し可能オブジェクトではなくプロパティとしてアクセスできる弱参照オブジェクトを作成するよりコンパクトな方法はありますか?

4

2 に答える 2

4

これにはweakref.proxyを使用します。

import weakref

class A(object):
    def __init__(self, parent)
        self.parent = weakref.proxy(parent)
于 2013-07-07T07:55:11.150 に答える
0

もう少しコンパクトにすることはできますが、思ったほどコンパクトではありません。問題は、2 つの相容れないニーズがあることです。

  1. の割り当ては、インスタンスで設定する必要があるため_parent、メソッドの本体 (例: ) 内にある必要があります。__init__
  2. プロパティはクラスで定義されている場合にのみ機能するため、メソッドの本体内でプロパティを作成することはできません。

さらに複雑なのは、「親」という名前に割り当てられていることを関数に「認識」させる方法がないparent = somePropertyMaker(ref(x))ことsomePropertyMakerです。つまり、プロパティの基になる隠し属性の名前を明示的に渡す必要があります。

それを念頭に置いて、これを行うことができます:

def weakProp(hidden):
    @property
    def prop(self):
        return getattr(self, hidden)()
    return prop

class A(object):
    def __init__(self, parent):
        self._parent = ref(parent)

    parent = weakProp('_parent')

class B(object):
    pass

>>> b = B()
>>> a = A(b)
>>> print b
<__main__.B object at 0x00000000029D0470>
>>> print a.parent
<__main__.B object at 0x00000000029D0470>

weakProp、非表示の属性を取得し、それを呼び出して弱参照オブジェクトにアクセスするプロパティ メーカー関数です。

于 2013-07-07T07:54:22.617 に答える