ホームページ >バックエンド開発 >Python チュートリアル >Pythonの魔法のメソッド - 属性変換とクラス表現を詳しく解説
型変換マジック
型変換マジックは、実際には str や int などのファクトリ関数を実装した結果です。通常、これらの関数には型変換関数も含まれています。
関連するマジック メソッドをいくつか示します。•__int__(自分)
•int関数に対応する整数型に変換します。
•__long__(自分)
•long関数に対応するlong整数型に変換します。
•__float__(自分)
•float関数に対応した浮動小数点型に変換します。
•__複雑__(自分)
•複素関数に対応した複素数型に変換します。
•__oct__(自分)
•oct関数に対応して8進数に変換します。
•__hex__(自分)
•hex 関数に対応する 16 進数に変換します。
•__index__(自分)
•まず、このメソッドは int または long の整数を返す必要があります。このメソッドは 2 つの場所で有効です。1 つ目は、演算子モジュールのインデックス関数によって取得される値です。2 つ目は、スライス操作に使用されます。以下のコードで具体的に説明します。
•__trunc__(自分)
• math.trunc(self) が使用されるときに呼び出されます。 __trunc__ は self 型の整数の切り捨てを返します (通常は長整数)。
•__強制__(自分、他人)
•実装された型強制。このメソッドは coerce 組み込み関数の結果に対応します (この関数は Python 3.0 以降削除されました。つまり、このマジック メソッドは無意味です。以降のバージョンで再びサポートが追加されるかどうかは、状況によって異なります)。公式による)•この関数の機能は、2 つの異なる数値型を同じ型に強制的に変換することです。例:
メソッドは、変換された 2 つの数値に対応するプリミティブを返します。優先順位は、複素数 > 浮動小数点数 > 長整数 > 整数です。変換時は2つのパラメータのうち優先度の高い型に変換されます。変換を完了できない場合、TypeError がトリガーされます。
そして、このマジックメソッドを定義するとき、変換が完了できない場合は、None を返す必要があります。
ここには重要なメカニズムがあります。Python が 1 + 1.0 などの演算を実行するとき、最初に coerce 関数を呼び出して同じ型に変換し、それから実行します。これが 1 + 1.0 = 2.0 である理由です。変換後の実際の演算は 1.0 +1.0 となります。このような結果が得られても不思議ではありません。
コード例:
リーリーここで注意すべき点は、マジック メソッドの戻り値は期待を満たさなければならないということです。たとえば、string (str)、list (list) などの他の型を任意に返す場合、__int__ は
int 型を返す必要があります。など、エラーが報告されます。
リーリーリーリー
ただし、int は long を返すことができ、int を返すと、long は自動的に long に処理されます。
リーリー
上記は python2.7.11 で発生しました。これは非常に奇妙な動作なので、エラーを避けるために、使用するときに対応する型を返すように注意する必要があると思います。
まず、operator.index()に対応しており、operator.index(a)はa.__index__()に相当します:
リーリー
シーケンスで使用すると驚くべきもう 1 つの特殊効果:
リーリー
インデックスとして使用でき、スライス操作を実行できます:
リーリー
実際、スライス内で使用される関数スライスがそれを処理します。興味のある学生は、この関数について学ぶことができます。
リーリー
コード例:
リーリー
クラスの表現:
クラスの表現は実際には外部特性です。たとえば、print ステートメントを使用すると、実際に出力されるのは対応する関数の出力です。
•__str__(自分)
•クラスのインスタンスで str() が呼び出されたときに発生する動作を定義します。 print はデフォルトで str() 関数を呼び出すためです。
•__repr__(自分)
•クラスのインスタンスで repr() が呼び出されたときに発生する動作を定義します。 str() と repr() の主な違いは、ターゲット グループです。 repr() は機械可読な出力を返し、str() は人間が読める出力を返します。 repr() 関数は交換モードでデフォルトで呼び出されます•機能。
•__unicode__(自分)
•クラスのインスタンスで unicode() が呼び出されたときに発生する動作を定義します。 unicode() は str() に非常に似ていますが、Unicode 文字列を返します。クラスで str() が呼び出されても、 __unicode__() のみを定義している場合は、呼び出されないことに注意してください•仕事。 __str__() を定義して、呼び出されたときに正しい値が返されるようにする必要があります。誰もが unicode() を使いたがるわけではありません。
•__format__(self, formatstr)
• 新しい書式文字列メソッドを使用して書式設定するためにクラスのインスタンスが使用されるときに発生する動作を定義します。たとえば、「Hello, {0:abc}!」.format(a) により、a.__format__("abc") が呼び出されます。これは、独自の数値型または文字列型を定義するのに最適です• は非常に意味があり、いくつかの特別な書式オプションを指定できます。
•__hash__(自分)
•クラスのインスタンスで hash() が呼び出されたときに発生する動作を定義します。辞書内で高速に比較できるように、整数を返す必要があります。•__hash__ を実装する場合、通常は __eq__ も実装することに注意してください。次のルールがあります: a == b は hash(a) == hash(b) を意味します。つまり、2 つのマジック メソッドの戻り値は一貫している必要があります。
•ここで「ハッシュ可能オブジェクト」の概念が導入されています。まず、ハッシュ可能オブジェクトのハッシュ値はライフサイクルを通じて変更されない必要があり、ハッシュ値を取得することは __hash__ メソッドを実装することを意味します。ハッシュ オブジェクトは同等です。つまり、__eq__ または
を実装します。
•__cmp__ メソッド、およびハッシュ オブジェクトが等しい場合、そのハッシュ値は等しくなければなりません。この機能を実装するには、__eq__ の戻り値が __hash__ と同じでなければなりません。•これらのデータ構造は内部でハッシュ値を使用するため、ハッシュ可能オブジェクトは辞書キーやコレクションのメンバーとして使用できます。 Python に組み込まれているすべての不変オブジェクト (タプル、文字列、数値など) はハッシュ可能ですが、リストなどの可変オブジェクトはハッシュできません。
• 辞書など。
•ユーザー定義クラスのインスタンスはデフォルトでハッシュ可能であり、そのハッシュ値は id 関数から取得されるため、それ自体以外の誰とも等しくありません。ただし、これは hash(a) == id(a) を意味するものではありません。この機能に注意してください。
•__nonzero__(自分)•クラスのインスタンスで bool() が呼び出されたときに発生する動作を定義します。このメソッドは、返したい値に応じて True または False を返す必要があります。 (python3.xでは__bool__に変更されました)
•__dir__(自分)•クラスのインスタンスで dir() が呼び出されたときに発生する動作を定義します。このメソッドは、プロパティのリストをユーザーに返す必要があります。
•__sizeof__(自分)•クラスのインスタンスで sys.getsizeof() が呼び出されたときに発生する動作を定義します。このメソッドはオブジェクトのサイズをバイト単位で返す必要があります。これは通常、C 拡張機能として実装された Python クラスにとってより意味があり、これらの拡張機能を理解するのに役立ちます。
特にわかりにくいところはないのでコード例は割愛します。
上記の Python マジックメソッド - 属性変換とクラス表現の詳細な説明は、すべてエディターが共有した内容です。参考にしていただければ幸いです。スクリプト ホームをサポートしていただければ幸いです。