2017-04-25 10 views
1

私はこのような問題に遭遇するたびにPythonで何年ものプログラミング経験を持っていますが、組み込みisinstance関数を使用しています。しかし、私はこれがPythonでこのようなことを行う理想的な方法かどうかは分かりません。派生クラスのインスタンスを処理する慣習的な方法?

私は、私のインスタンスのほとんどが基本クラスを持っています。

class Base(): 
    def a(self): 
    return 1 

次のようになり、わずかに異なるクラス持って、私はまた:今すぐ

class Extended(Base): 
    def b(self): 
    return 2 

を、のいずれかのインスタンスになり受け取った引数に応じて、追加機能を持っているかもしれない第三のクラスがあります以前のクラス。

class User(): 
    def __init__(self, arg): 
    ... # do some common work 
    if isinstance(arg, Extended): 
     ... 
     # define more functionality which will call method 'b' 
     # at some point during runtime (as event handler or smth) 

これは本当にこの簡単な例でPythonで行くためにまたは多分私のような何かにベースのインタフェースを変更することを検討すべきである方法である:

1のに従って、より良いアプローチです
class Base2(): 
    supports_more_func = False 

    def a(self): 
    return 1 

    def b(self): 
    pass 

class Extended2(Base2): 
    supports_more_func = True 

    def b(self): 
    return 2 

class User(): 
    def __init__(self, arg): 
    ... # do some common work 
    if arg.supports_more_func: 
     ... 
     # define more functionality which will call method 'b' 
     # at some point during runtime (as event handler or smth) 

あなたは男、なぜですか?

答えて

0

一般に、オブジェクト指向プログラミングを行うときは、isinstanceを使用することはほとんどありません。特に、使用するクラスの設計を担当している場合は、S.O.L.I.D. principlesが破損するためです。

代わりに、よく定義された共通のインターフェースを持つようにクラスを設計して使用するだけです。だから、タイプのテストやメンバーのテストはほとんどありません。私が行くと思い

の方法は、次のようになります。

class Base2(): 
    def a(self): 
    return 1 

    def b(self): 
    pass 

class Extended2(Base2): 
    def b(self): 
    # all that extra functionality that was in User.__init__() 
    return 2 

class User(): 
    def __init__(self, arg): 
    ... # do some common work 
    arg.b() 

今私はと一部であることを推測:

# define more functionality which will call method 'b' 
    # at some point during runtime (as event handler or smth) 

がしっかりExtended2Userないと相まって、いくつかのデータや処理を持っていますが、私は確かにそのデータを引数としてarg.b()に与えるエレガントな方法があると確信しています。

基本的には、何かをするにはisinstance()を使用する必要がある時間の99%であると言えます。これは設計上の問題があることを意味し、同じことをする良い方法があります。ここで

は、トピックに関するいくつかのウェブ文学です:応答のための

+0

ありがとう!私はUIアプリを念頭に置いているということです。 Userクラスでは、 'arg'が拡張されていた場合、画面上にいくつかの追加ウィジェットが表示されるはずです。ユーザーがその別のウィジェットをクリックすると、ユーザーはそのコールをExtendedに転送します。問題は、 'arg'がBaseだった場合、追加のウィジェットが表示されるべきではないので、どのタイプのタイプで作業するかを判断する方法が本当に必要なことです。 面白いのは、 JavaやC++で作業する人はこれを行うでしょうか? –

関連する問題