2

私は自分のコードに少し一般性を与えようとしています。基本的に私が探しているのはこれです。

APIインターフェースMyAPIを書きたい:

class MyAPI(object):
    def __init__(self):
       pass

    def upload(self):
       pass

    def download(self):
      pass

class MyAPIEx(object):
   def upload(self):
      #specific implementation

class MyAPIEx2(object): 
   def upload(self)
    #specific implementation

#Actual usage ... 
def use_api():
     obj = MyAPI()
     obj.upload()

だから私が欲しいのは、構成に基づいて、
MyAPIExまたはMyAPIEx2のいずれかのアップロード関数を呼び出すことができるはずです。私が探している正確なデザインパターンは何ですか?Pythonでそれを実装するにはどうすればよいですか?

4

2 に答える 2

2

Factoryメソッド(またはファクトリの他の実装)を探しています。

于 2012-05-21T07:27:51.793 に答える
1

詳細情報なしで、使用しているパターンを言うのは本当に難しいです。MyAPIをインスタンス化する方法は、確かに@Darhazerのようなファクトリですが、MyAPIクラス階層に使用されるパターンについて知りたいと思っているようですが、これ以上の情報がないと言えません。

以下でいくつかのコードを改善しました。IMPROVEMENTという単語が含まれるコメントを探してください。

class MyAPI(object):
    def __init__(self):
       pass

    def upload(self):
       # IMPROVEMENT making this function abstract
       # This is how I do it, but you can find other ways searching on google
       raise NotImplementedError, "upload function not implemented"

    def download(self):
       # IMPROVEMENT making this function abstract
       # This is how I do it, but you can find other ways searching on google
       raise NotImplementedError, "download function not implemented"

# IMPROVEMENT Notice that I changed object to MyAPI to inherit from it
class MyAPIEx(MyAPI):
   def upload(self):
      #specific implementation

# IMPROVEMENT Notice that I changed object to MyAPI to inherit from it
class MyAPIEx2(MyAPI): 
   def upload(self)
      #specific implementation


# IMPROVEMENT changed use_api() to get_api(), which is a factory,
# call it to get the MyAPI implementation
def get_api(configDict):
     if 'MyAPIEx' in configDict:
         return MyAPIEx()
     elif 'MyAPIEx2' in configDict:
         return MyAPIEx2()
     else
         # some sort of an error

# Actual usage ... 
# IMPROVEMENT, create a config dictionary to be used in the factory
configDict = dict()
# fill in the config accordingly
obj = get_api(configDict)
obj.upload()
于 2012-05-21T08:20:38.910 に答える