2

この記事でGuido van Rossum は、この種の Python でのマルチメソッドの実装について次のように述べています。

def foo(a, b):
    if isinstance(a, int) and isinstance(b, int):
        ...code for two ints...
    elif isinstance(a, float) and isinstance(b, float):
        ...code for two floats...
    elif isinstance(a, str) and isinstance(b, str):
        ...code for two strings...
    else:
        raise TypeError("unsupported argument types (%s, %s)" % (type(a), type(b)))

「退屈」で「あまりOOではない」。彼は次に、デコレータを使用してマルチメソッドを実装する方法について説明します。これは、Python のかなり深い知識がなければアクセスできないと思います。

私の質問: マルチメソッドを記述する必要があります。上記のコードで実際に「オブジェクト指向ではない」とは何ですか?

更新: Thomas Orozco の回答に照らして、マルチメソッドを実際に記述する必要がないことに気付きました。

4

1 に答える 1

4

メソッドに渡されるオブジェクトの型を調べるのではなく、オブジェクト自体がロジックを実装するようにします。

例を見てみましょう:len関数。

ネイティブ実装は次のようになります。

def len(x):
    if type(x) == str:
        # compute the length of a string
    elif type(x) == list:
        # compute the length of a list
    else:
        #

しかし、これにはいくつかの注意点があります

  • len再実装しないと、独自のオブジェクトでサポートできませんでしたlen
  • それは巨大な、読めない、混乱です

そして、最も重要なのは、オブジェクト指向の部分です。これは、 の実装がstrコードベース全体に分散していることを意味します。長さを計算するためのコードはここにあり、スライスするためのコードは別の場所にあります...


代わりに、より健全な設計が Python で使用されています。

def len(x):
    return x.__len__()

__len__メソッド自体を実装するのは、各オブジェクト次第です。このlen関数は、オブジェクトにその長さを尋ねるだけです。

ある程度、これは「戦略パターン」と見なすことができます

于 2013-09-03T21:28:23.990 に答える