- Pythonのデータモデルのおかげで、ユーザー定義型は限り自然に振る舞うことができるビルトインタイプ。そして、これはダックタイピングの精神で、継承することなく達成することができる:あなただけの期待どおりに動作するためにあなたのオブジェクトのために必要なメソッドを実装します。
Staticmethod対1クラスメソッド
クラスTest: @staticmethod DEF F1(*引数): プリント引数の #はクラスではなくインスタンスで動作するメソッドを定義します。 @classmethod DEF F2(*引数):#1のCLS =引数[0] 印刷引数の T =試験() t.f1( '1')#( '1') t.f2( '1')#(<クラス0x10afeca78で__main __。試験>、「1」) #1。クラスメソッドの最も一般的な用途は、代替コンストラクタのためです。 本質的には#2、静的メソッドは単なる関数のようなものである 代わりに定義されるので、#はクラス本体に住んで起こる #モジュールレベル。
2.書式設定を表示
BRL = 1 / 2.43 プリント(BRL)#0.4115226337448559 プリント(フォーマット(BRL、 '0.4F'))#0.4115 プリント( 'BRL = {速度:0.2F}'形式(速度= BRL))#1 BRL = 0.41 印刷(フォーマット(42、 'B'))#101010 プリント(フォーマット(2/3、 '0.1パーセント'))#66.7% 日時インポート日時からは 今= datetime.now() プリント( "それは{だ:%I: %のMの%のP}」形式(今))#これだ10:59の。 クラスA: デフ__init __(自己、A1、A2): self.a1 = A1 self.a2 = A2 デフ__iter __(自己): 戻り値(I I(self.a1、self.a2))のための デフ__format __(自己、 '= fmt_spec'): fmt_specが':' fmt_spec = '({}、{})' 戻りfmt_spec。フォーマット(*自己) A = A(3,4) プリント(フォーマット(A))、#(3、4) プリント(フォーマット( ' - > {}、{} < - '))# - > 3,4 < - #1などのフォーマット文字列'{0.mass:5.3e}実際2つの使用しています #別々の表記法を。コロンの左側にある「0.mass」は 置換フィールドの構文の#のFIELD_NAME部と、後の「5.3e」 #コロン、書式指定子です。 #2。いくつかのビルトインタイプは、独自のプレゼンテーションコードを持っています。 #3クラスはない__format__、フォーマット(OBJ)は、STR(OBJ)を返していない場合
「保護」3.プライベートとPythonの属性
- Pythonの店舗先頭にアンダースコアとクラス名が付いたインスタンス__dict__に2つのアンダースコア、と属性。(犬+ __mood - > _Dog__mood)
- 名前マングリングは安全ではなく、セキュリティに関するものです:偶然のアクセスではなく、意図的な不正行為を防ぐために設計されています。
- 本番コードで「v1._Vector__x = 7」を行っている場合は、何かが吹くまでなら、あなたは文句を言うことはできません。
- フォームself._xが広まっているが、「保護」属性はそれほど一般的ではないことを呼び出すと呼ばれる「保護」の実践documentation.9のPythonのいくつかのコーナーで「保護」されている単一_接頭辞を持つ属性は、慣例により属性。一部では「プライベート」属性という呼びます。
4.オブジェクト表現
# - * -コーディング:UTF-8 - * - 配列インポート配列から インポート数学 クラスVector2d: タイプコードは= 'D' DEF __init __(自己、X、Y): 自己.__ X =フロート(X) (自己.__ Y =フロートy)は @property デフX(自己): 戻り値の自己.__ X @property デフyの(自己): 戻り値の自己.__ Y デフ__iter __(自己): I IN(self.x、self.yのリターン(I))#反復子 #収量self.x。yield.self.y DEF __repr __(自己):開発者のため# CLASS_NAME =タイプ(自己).__ name__ 。復帰'{}({!R} {!R})'形式(CLASS_NAME、*セルフ)#反復可能 DEF __str__ (自己):ユーザーのための# リターンSTR(タプル(自己)) デフ__bytes __(自己): 戻り値(バイト([ORD(self.typecode)])+バイト(配列(self.typecode、自己))) デフ__eq __(自己、他): #それはVector2dオペランドのために働くだけでなく、Trueを返します比較するとき 、同じ数値を保持する他のイテラブルに#Vector2dインスタンスを #(例えば、ベクトル(3,4)== [3、4])。 リターンタプル(自己)==タプル(他の) デフ__abs __(自己): 戻りmath.hypot(self.x、self.y) デフ__bool __(自己): 戻り値ブール値(ABS(自己)) @classmethod デフfrombytes(CLS 、オクテット): #は最初のバイトからタイプコードを読みます。 タイプコードは、= CHR(オクテットは、[0]) #オクテットからmemoryviewを作成し、それをキャストする型コードを使用しています。 memv = memoryview(オクテット[1:])。キャスト(タイプコード) #プリント(memv)#<0x1012fb108のメモリ> #プリント(* memv)#3.0 4.0 戻りCLS(* memv) デフ__format __(自己、fmt_spec = ''): もしfmt_spec.endswith( 'P') : fmt_spec = fmt_spec [ - 1] outer_fmt = '<{}、{}>' 他: outer_fmt = '({}、{}') 成分=(フォーマット(C、fmt_spec)自己におけるC用) outer_fmt返します。フォーマット(*成分) デフ__hash __(自己): 戻りハッシュ(self.x)^ハッシュ(self.y) V1 = Vector2d(3、4) 印刷(V1.X)#3.0 #V1.X = 5#はAttributeError:属性を設定することができない 、B = V1#__iter__ プリント(a、b)は#3.0 4.0 プリント(のrepr(V1))#Vector2d(3.0、4.0) プリント(V1)#(3.0、4。0)__str__ プリント(バイト(V1))#のB」D \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X08 @ \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X10 @」 印刷(V1 ==のeval(のrepr(V1)))#真__eq__の 印刷(ABS(V1))#5.0 印刷(ブール値(V1))#トゥルー プリント(ブール値(Vector2d(0、0)))#偽 V2 = Vector2d.frombytes(バイト(V1)) プリント(V1 == v2)は#トゥルー プリント(フォーマット(V1))#(3.0、4.0) プリント(フォーマット(V1、 '.3f'))#(3.000、4.000) 印刷(フォーマット(V1、 '.2ep'))#<3.00e + 00、4.00e + 00> プリント(ハッシュ(V1))#7 のPython 3では#1、__repr__、__str__、及び__format__は常に返す必要があります #ユニコード文字列(タイプ文字列)。のみ__bytes__を返すことになっている #バイトシーケンス(タイプバイト)。 #2。我々は__hash__メソッドを実装することができます。それはint型を返す必要がありますし、 #理想的なオブジェクトのハッシュがあることの属性を考慮して 、#も__eq__方法で使用されている等しいとオブジェクト理由 #は、同じハッシュを持つ必要があります。__hash__特別なメソッドのドキュメントの 位のハッシュミックスするビット単位のXOR演算子(^)を使用することを提案 #コンポーネントを。 #3。これは、プロパティを実装するか、そうでなければすることは厳密には必要ありません #インスタンスがハッシュ可能タイプを作成するために属性を保護します。 #__hash__を実装し、正しく__eq__は、それが取るすべてです。しかし、 インスタンスの#ハッシュ値を変更することになってされることはありません。