0

特別なメソッドを使用することと、通常のクラス メソッドを定義することの違いは何ですか? 私はそれらの多くをリストしているこのサイトを読んでいました。

たとえば、このようなクラスを提供します。

class Word(str):
    '''Class for words, defining comparison based on word length.'''

    def __new__(cls, word):
        # Note that we have to use __new__. This is because str is an immutable
        # type, so we have to initialize it early (at creation)
        if ' ' in word:
            print "Value contains spaces. Truncating to first space."
            word = word[:word.index(' ')] # Word is now all chars before first space
        return str.__new__(cls, word)

    def __gt__(self, other):
        return len(self) > len(other)
    def __lt__(self, other):
        return len(self) < len(other)
    def __ge__(self, other):
        return len(self) >= len(other)
    def __le__(self, other):
        return len(self) <= len(other)

これらの特別なメソッドのそれぞれについて、代わりに通常のメソッドを作成できないのはなぜですか?それらは何が違うのですか? 見つからない基本的な説明が必要だと思います、ありがとう。

4

5 に答える 5

4

これを行うのは Pythonic な方法です。

word1 = Word('first')
word2 = Word('second')
if word1 > word2:
    pass

コンパレータメソッドを直接使用する代わりに

NotMagicWord(str):
    def is_greater(self, other)
        return len(self) > len(other)

word1 = NotMagicWord('first')
word2 = NotMagicWord('second')
if word1.is_greater(word2):
    pass

そして、他のすべての魔法の方法と同じです。たとえば、__len__組み込み関数を使用して Python にその長さを伝えるメソッドを定義します。len二項演算子、オブジェクトの呼び出し、比較、その他多くの標準操作が行われている間、すべての魔法のメソッドは暗黙的に呼び出されます。A Guide to Python's Magic Methodsは非常に優れています。これを読んで、オブジェクトにどのような動作を与えることができるかを確認してください。慣れている場合は、C++ での演算子のオーバーロードに似ています。

于 2013-10-22T04:50:07.633 に答える