多数のプロパティを A オブジェクトからそのメンバーにデリゲートしようとしている場合は、 、、およびのb
中でそれを行う方がおそらく簡単です。__getattr__
__setattr__
__delattr__
class A(object):
delegated = ['c', 'd', 'e', 'f']
def __getattr__(self, attr):
if attr in A.delegated:
return getattr(self.b, attr)
raise AttributeError()
簡潔にするため、およびと の違いを説明する必要がないように、ここでは__setattr__
との定義を示していません。さらに情報が必要な場合は、ドキュメントを参照してください。__delattr__
__getattr__
__getattribute__
これは、さまざまな属性をさまざまなメンバーにプロキシしたいクラスに容易に拡張できます。
class A(object):
b_delegated = ['c', 'd', 'e', 'f']
x_delegated = ['y', 'z']
def __getattr__(self, attr):
if attr in A.b_delegated:
return getattr(self.b, attr)
elif attr in A.x_delegated:
return getattr(self.x, attr)
else:
raise AttributeError()
すべての属性を動的に委譲する必要がある場合、それはほぼ同じくらい簡単です。self.b
初期化時または呼び出し時にの属性 (またはの) のリストを取得しself.b.__class__
(4 つの可能性のうちどれを実行するかによって異なります)、それを static list の代わりに使用しますb_delegated
。
もちろん、これを名前 (_private
メソッドを削除するなど)、タイプ、または任意の述語 (callable
属性を削除するなど) でフィルタリングできます。
または、上記のいずれかを組み合わせます。
とにかく、これは Python で (特に動的な) プロキシを行うための慣用的な方法です。完璧ではありませんが、別のメカニズムを発明しようとするのはおそらく良い考えではありません。
実際、完璧であることを意図したものではありません。これはあまり頻繁に行うべきではなく、行うときに偽装しようとしてもいけません。ユーザーがそれを知ることは実際に役立つため、actypes.cdll
またはモジュールが実際に別のものに委任されていることは明らかです。pyobjc
あるクラスのパブリック インターフェイスのほとんどを別のクラスに委譲する必要があり、委譲についてユーザーに知られたくない場合は、その必要はないかもしれません。おそらく、プライベート オブジェクトを直接公開するか、オブジェクト モデルを再編成して、ユーザーが最初から適切な操作を行えるようにする方がよいでしょう。