0

プラットフォームによってメソッドの動作が異なるオブジェクトをインスタンス化できるようにしたいと考えています。

import sys

class MyClass(object):

    @property
    def os_is_darwin(self):
        return sys.platform == 'darwin'

    def get_home_directory(self):
        if self.os_is_darwin:
            return '/Users/travis/'
        else:
            return 'C:\\Users\\travis\\'

抽象基本クラスを使用し、Mac と Windows の実装をサブクラスに分割することで、これを行うよりクリーンな方法はありますか? 重要なことは、上記のクラスが行うように、呼び出し元のプラットフォームを抽象化することです。

my_object = MyClass()
print my_object.get_home_directory()
4

2 に答える 2

3

本当にクラスである必要MyClassがありますか?それとも、オブジェクトを作成するために呼び出すことができるという点で、単にクラスのように見えるのでしょうか? MyObject完全にひねくれたように聞こえないように呼んでみましょう。最終的には次のようになります。

def MyObject():
  import sys
  if sys.platform == 'darwin':
    return MyDarwinObject()
  else:
    return MyDefaultObject()

my_object = MyObject()
print my_object.get_home_directory()

これは、最も使用する可能性が高い方法で「アヒルのように鳴く」ものであり、必要に応じて、実際の異なるクラスを完全に分離しておくことができます。(機能を共有したい場合は、もちろん継承を使用できます。)

当然のことながら、if-else チェーンは、辞書などのより拡張可能なアプローチに置き換えることができます。

于 2013-06-12T20:23:57.317 に答える
1

真のオブジェクト指向の方法は、1 つの基本クラス (おそらく抽象的ですが、必ずしもそうとは限りません) と 2 つの具体的な実装 (別名Strategy パターン) を作成することです。これらのクラスを直接インスタンス化する代わりに、my_object = MyClass()「ファクトリー」メソッドを作成して正しい実装をインスタンス化し、それを呼び出し先に返す - 別名ファクトリーパターン

そんな感じ:

class BaseHandler(object):
    pass

class OSXHandler(BaseHandler):
    pass

class WindowsHandler(BaseHandler):
    pass

def create_handler():
    import sys
    return OSXHandler() if sys.platform == 'darwin' else WindowsHandler()

handler = create_handler()
handler.get_home_directory()
于 2013-06-12T20:28:32.843 に答える