2

オプションのパーツ/クラスを使用してPythonパッケージを作成しました。このオプション部分(OptClass)を使用する場合、クラス(ExampleClass)の継承を変更する必要があります。今私はこのコードを使用します:

if use_option :
    _opt_class =  __import__('package.my_module', globals(), locals(), ['OptClass']).OptClass
else :
    _opt_class = object # do not use the optional class

....

class ExampleClass(base_module.BaseHandler, _opt_class):

    ....

これを解決する別のPythonicの方法はありますか?たとえば、動的継承またはレイジーローディングを使用する、または...?

4

3 に答える 3

2

私はおそらくクラスデコレータを使用します:

def optional_inherit(cls):
    if use_option:
        from package.my_module import OptClass
        class ExampleClassWithOptClass(cls, OptClass):
            pass
        return ExampleClassWithOptClass
    else:
        return cls

...

@optional_inherit
class ExampleClass(base_module.BaseHandler):
    ...

あなたがこれをたくさんしているなら、あなたはoptional_inherit議論をするために書くことができます。この場合、@optional_inherit(use_option, 'package.mymodule.OptClass')

于 2013-02-14T17:37:13.753 に答える
0

ExampleClassに基づいて動作を追加したいようですuse_optionuse_option2つのクラス(一方はもう一方から派生し、追加の動作が追加されています)を記述し、一般名を使用して、 :に応じてクラスの1つを指します。

from package.my_module import OptClass

class SimpleExampleClass(base_module.BaseHandler):
    pass

class ExtendedExampleClass(SimpleExampleClass, OptClass):
    pass

ExampleClass = ExtendedExampleClass if use_option else SimpleExampleClass

このように、追加の機能を追加する必要はありません。すでにExtendedExampleClassすべてが含まれています。OptClass

(おそらくこれはミリムースが言及した戦略パターンです;私は本当に知りません。)

于 2013-02-14T17:30:46.333 に答える
0

このモジュール性を明示的にモデル化することを検討します。あなたはOAuth2について言及しているので、例のために、追加したい機能はそのプロトコルを使用した認証であると仮定します。

次に、次のようなファイルがあります。

authmodule.py

import oauth2client
# ...

class OAuth2Module(object):
    # ...

exampleclass.py

class ExampleClass(base_module.BaseHandler):
    def __init__(self, auth_module, ...):
        self.auth_module = auth_module
        # ...

    def foo(self):
        if self.auth_module:
            self.auth_module.bar()

main.py

# this is where ExampleClass is created
if use_option:
    # the optional dependency only really gets pulled in here
    from authmodule import AuthModule
    example_obj = ExampleClass(AuthModule())
else:
    example_obj = ExampleClass(None)

# ...
example_obj.foo()

ExampleClass明らかに、これは、ボイラープレートをからに移動するなど、少し異なる方法で実装できますDummyAuthModule。(おそらく継承されたクラスがどのように使用されているかがわからないため、実際に確認することはできません。)

于 2013-02-14T17:56:52.780 に答える