ホスト オブジェクトの辞書にデータを格納する記述子があります。そして、クラス階層に同じ名前のこの記述子のフィールドがあります。
class ADescriptor(object):
def __init__(self, keyname='descr'):
self.keyname = keyname
def __get__(self, obj, objtype):
return getattr(obj, self.keyname, 8192 )
def __set__(self, obj, val):
setattr(obj, self.keyname, val)
class A(object):
f = ADescriptor('keyA')
class B(A):
f = ADescriptor('keyB')
b = B()
b.f = 'b'
print super(B,b).f
super(B,b).f = 'a'
最後の行は機能しません: super(B,b).f = 'a'
なぜ機能し、類似のセットが機能しないのですか? A. dict ['f']よりもエレガントな方法で A の f を設定できますか。(b,'a') を設定しますか?
訂正:
私の最初の投稿で与えられた形式では、Af は A のキー名の名前付きプロパティ (欠落) またはデフォルト 8192 に評価されます - それとは何の関係もありません。そのため、A. dict ['f'] - を使用してget呼び出しを除外しました。Af を必要な ADescriptor インスタンスに評価できるようにするには、わずかな変更が必要でした。
def __get__(self, obj, objtype=None):
if not obj: #return descriptor itself if no bound object given
return self
return getattr(obj, self.keyname, 8192 )
この場合A.f.__set__(b,'a')
は機能します。しかし、それはまだ醜いです!@BiggAl が提供するプロパティ ソリューションは、私のニーズには適していません。すべての記述子をプロパティでラップする必要があります。