0

イテレータとゲッターを介して文字列でいっぱいの配列に概念的にアクセスできるようにするPythonオブジェクトがあります。ただし、配列内の各要素の正確な値を計算するのは非常にコストがかかるため、配列内の各スロットのコンテンツのプロキシオブジェクトを返し、本当に必要なときに実際の値をその場で計算することを検討しています。

つまり、私はこれを書きたいと思います:

bar = foo.get(10) # just returns a proxy
baz = bar # increase proxy reference
l = [baz] # actually increase proxy reference again.
print baz # ooh, actually need the value. Calculate it only the fly.
v = '%s' % bar # I need the value here again
if bar is None: # I need the value here again
    print 'x'
if bar: # I need the value here again
    print 'x'
for i in bar: # I need the value here again
    print i

C ++では、間接参照演算子をオーバーロードしようとします...何か考えはありますか?

これらのケースのそれぞれについて、特定のpython'magic'関数(__str__forなどprint baz)をオーバーロードできることを理解していますが、次のことを疑問に思います。

  • これは実際に考えられるすべてのユースケースをカバーします(Pythonマジック関数の使用を伴わない変数のコンテンツにアクセスする方法はありますか)
  • これを行うためのより一般的な方法があります
4

1 に答える 1

1

Python では、カスタム タイプを返し、__str__()印刷時に文字列表現を計算するメソッドをオーバーライドします。

class MyCustomType(object):
    def __str__(self):
        return "My string is really costly to produce"

ユースケースに応じて、Python が提供するさまざまなフックをまだ見ています。

  • カスタム クラスの属性アクセスは、__getattr__メソッドまたはproperty.
  • シーケンスのようなクラス (リスト、タプル、文字列) の個々の項目へのアクセスと、マッピング型のクラスは でフックできます__getitem__

ユースケースに基づいて、フックする必要があるものを決定する必要があります。その時点で、高価な計算を行う必要が避けられなくなります。Python では、オブジェクトの存続期間中のほぼすべてのポイントを簡単にフックできます。

于 2012-10-08T14:09:13.447 に答える