最初に - これが重複している場合はお詫び申し上げます - 以前に同様の議論を見たような気がしますが、実際には見つかりません。
私の質問は、複合クラスの各マイナー内からの継承のように見えるべき Python のオブジェクト構成に関するものです。ユースケースは、複数のオブジェクトインスタンスが属性とその値の共通のコアを共有することです (そして、代わりに古典的な継承のケースとなる共通の構造だけではありません)。
単純な属性を使用してこれを行うことができます。つまり、各クラスに「shared_attributes」という属性を 1 つ持たせるだけで、それ自体がすべての値を格納するクラスになります。
class CoreClass(object):
def __init__(self):
self.attr = 'asdf'
class CompClass1(object):
def __init__(self, core):
self.core_attr = core
class CompClass2(object):
def __init__(self, core):
self.core_attr = core
しかし、これには属性を介して各共有属性にアクセスする必要がありclass.core_attr
、これは望ましくありません (理由の 1 つは、コードの大部分を大幅に書き直す必要があるためです)。
__getattr__
そのため、代わりに、Python の組み込みオブジェクト メソッドに依存する複合パターンを使用したいと思います。
class TestClass1(object):
def __init__(self):
self.attr1 = 1
def func_a(self):
return 'a'
class CompClassBase(object):
def __init__(self, test_class):
self.comp_obj = test_class
def __getattr__(self, item):
return getattr(self.comp_obj, item)
class CompClass1(CompClassBase):
def __init__(self, test_class):
CompClassBase.__init__(self, test_class)
self.attr2 = 13
def func_b(self):
return '1b'
class CompClass2(CompClassBase):
def __init__(self, test_class):
CompClassBase.__init__(self, test_class)
self.attr2 = 23
def func_b(self):
return '2b'
if __name__ == '__main__':
tc = TestClass1()
cc1 = CompClass1(test_class=tc)
cc2 = CompClass2(test_class=tc)
print cc1.attr1
print cc1.attr2
print cc1.func_a()
print cc1.func_b()
print cc2.attr1
print cc2.attr2
print cc2.func_a()
print cc2.func_b()
必要に応じて、次のように出力されます。
1
13
a
1b
1
23
a
2b
このパターンは私のニーズに完全に適合しますが、それについて私に確信させたい何かがあります...
編集: (いくつかのコメントに応答するため) このパターンが共有クラスのすべての属性を共有することが不可欠です (前のオブジェクトを考えると):
cc1.attr1 = 'this is a test'
cc2.attr1 # must now be 'this is a test' as well!
2番目の編集:私はこのパターンを数週間使用しており、美しく機能します. ただし、今後はこのパターンを標準ツールキットに含めたいので、まだ議論を望んでいます:-)
では、私の質問は単純です。これは良い習慣ですか? この特定の Python パターンには欠点がありますか? ここでいくつかの危険に注意する必要がありますか?