クラスコンストラクターはサブクラスを返す必要がありますか?
これは主にOOPスタイルとPythonスタイルに関する質問です。一般的なケースソリューションを実装する必要があり、パフォーマンス上の理由から、特定の入力タイプ用に最適化されたソリューションを実装する必要があるという問題があります。入力タイプはユーザーによって異なります。現在、一般的なケースのソリューションをサブクラス化して最適化されたソリューションを作成することにより、これを実装しています。私が何を意味するかを説明するのを助けるために、私は次の例を思いついた。
from collections import Counter
class MyCounter(object):
"""General Case Counter"""
def __init__(self, seq):
self.seq = seq
def count(self, key):
return sum(key == item for item in self.seq)
class OptimizedCounter(MyCounter):
"""Counter optimized for hashable types"""
def __init__(self, seq):
self.counter = Counter(seq)
def count(self, key):
return self.counter.get(key, 0)
counter = MyCounter(['a', 'a', 'b', [], [0, 1]])
counter.count([0, 1])
# 1
counter = OptimizedCounter(['a', 'a', 'b'])
counter.count('a')
# 2
私の質問は、ユーザーが実装方法を気にすることなく適切なインスタンスを取得できるように、スムーズなインターフェイスをどのように設計するかです。私は次のようなことを考えましたが、それは私には醜い感じがします。このようなことを行うためのより標準的なまたはOOPの方法はありますか?
class MyCounter(object):
"""General Case Counter"""
def __new__(cls, seq):
if hasOnlyHashables(seq):
return object.__new__(OptimizedCounter)
else:
return object.__new__(MyCounter)