変数の遅延読み込みを実装したかったのですが、記述子を少し誤解しているようです。オブジェクト変数が欲しいのですが、最初のアクセス時にobj.load()関数を呼び出して、変数を実際の値で初期化します。私が書いた
class ToLoad(object):
def __init__(self, loader_name="load")
self.loader_name=loader_name
def __get__(self, obj, type):
if not (hasattr(obj, "_loaded") and obj._loaded):
obj._loaded=True
getattr(obj, self.loader_name)()
return None
class Test(object):
x=ToLoad()
def __init__(self, y):
self.y=y
def load(self):
print("Loading {}".format(self.y))
self.x=self.y
t1=Test(1)
t2=Test(2)
print("A", t1.x)
print("B", t2.x)
print("C", t1.x)
これは、少なくとも最初のロード時に実際の値を返すことができません。誰かがその問題を解決する別の方法を提案できますか?その時点で属性が「x」と呼ばれていることがわからないため、 getで正しい値を返す方法がわかりません。その他の方法で?
DAMN、私自身の質問に答えることはできません...だからここに編集があります:入力してくれてありがとう!ただし、load()関数は多くの異なる変数をロードするため、変数自体を返しません。また、遅延読み込みを使用するための表記を最小限に抑えたいと思います。だから私はデコレータを思いついた
class to_load:
def __init__(self, *vars, loader="load"):
self.vars=vars
self.loader=loader
def __call__(self, cls):
def _getattr(obj, attr):
if attr in self.vars:
getattr(obj, self.loader)()
return getattr(obj, attr)
else:
raise AttributeError
cls.__getattr__=_getattr
return cls
@to_load("a", "b")
class Test:
def load(self):
print("Loading")
self.a=1
self.b=2
t=Test()
print("Starting")
print(t.a)
print(t.b)
#print(t.c)
それは大丈夫ですか?私が物事を壊しているかどうかはわかりません。