質問
私が使っている基底クラスのコンストラクタとして工場内のクラス変更にこのコンストラクタ/工場を選定し、適切なクラスはこのアプローチはpythonの実践がより優雅なょうか?
私ため読みしていmetaclassesなき大盛況のうちに終了しました。
こちらはどうなっています。
class Project(object):
"Base class and factory."
def __init__(self, url):
if is_url_local(url):
self.__class__ = ProjectLocal
else:
self.__class__ = ProjectRemote
self.url = url
class ProjectLocal(Project):
def do_something(self):
# do the stuff locally in the dir pointed by self.url
class ProjectRemote(Project):
def do_something(self):
# do the stuff communicating with remote server pointed by self.url
このコードを作成しますインスタンスのProjectLocal/ProjectRemote通の基底クラスプロジェクト:
project = Project('http://example.com')
project.do_something()
知っている代わりに生地を使用数を返しますclassオブジェクトに基づき、urlをコードより:
def project_factory(url):
if is_url_local(url):
return ProjectLocal(url)
else:
return ProjectRemote(url)
project = project_factory(url)
project.do_something()
は私の最初のアプローチだけの味でもあるかのように隠れた穴?
解決
いわのファクトリ関数です。でリファレンスマニュアル読みやすく、理解するかがますます重要になっていく。対応オプションつかの方法などにより通の判別子の機能のマップ結果。
最初の例ではの作品であり、運よりデザイン。何をしたい場合は、い __init__
で定義されたサブクラス?
他のヒント
ただし必要metaclassesます。の __new__
方法。ることができまコントロールしなければなら、オブジェクトだけでなく、のトの再計算などを返しオブジェクトの希望する
class Project(object):
"Base class and factory."
def __new__(cls, url):
if is_url_local(url):
return super(Project, cls).__new__(ProjectLocal, url)
else:
return super(Project, cls).__new__(ProjectRemote, url)
def __init__(self, url):
self.url = url
以下のリンクをするのに役立つかもしれない:http://www.suttoncourtenay.org.uk/duncan/accu/pythonpatterns.html#factory http://code.activestate.com/recipes/86900/
また、ご利用の新しいスタイルの授業は、__new__として、工場の機能をいくつかの基底クラスでは、別のクラスは、より良い)がなんと、通常はそれぞれについて、"これまでってください).
工場機能は一般的に簡素化して他の人に既に掲載)
また、がんに良いアイデアセットの__class__属性を使って行われます。
おたのしみください。回答のリンクです。
すべて最高です。
ええ、どのよ@scooterXL、工場の機能が最適解その場合は、そのよう注意する場合のため工場としてclassmethods.
考え、以下のクラス階層:
class Base(object):
def __init__(self, config):
""" Initialize Base object with config as dict."""
self.config = config
@classmethod
def from_file(cls, filename):
config = read_and_parse_file_with_config(filename)
return cls(filename)
class ExtendedBase(Base):
def behaviour(self):
pass # do something specific to ExtendedBase
をすばやく作成できまBaseオブジェからconfig dictから設定ファイル:
>>> Base({"k": "v"})
>>> Base.from_file("/etc/base/base.conf")
もできないのと同じExtendedBase無料:
>>> ExtendedBase({"k": "v"})
>>> ExtendedBase.from_file("/etc/extended/extended.conf")
このように、こclassmethod工場できると考えられていますの補助コンストラクタです。
私は別のファクトリクラスではないかと思います。このような利用のメ授業や課題を self.__class__
もしないようにして入れについての知識を授業で利用可作成します。むしろ、私は利用可能な全ての授業に登録し移動し、工場の中でモジュールにサポートいたします。にあるクラスについての情報が選択このクラスの工場(この名前は、正規表現または呼び出し可能オブジェクト(例えばクラスメソッドの登録クラス)).
もっとも実装などのような封止や情報隠されているのです。
私の第二のアプローチを用い、工場の機能がたくさんより、実施の基底クラスに依存し、そのサブクラス.