进击のpython
メソッドクラス二重下線
ダブル下線のクラスは、特別な方法で、二重下線名で添加する方法は、二重定義下線
そして言葉遣いは、それが実際に特別な意味を持っていることを言います
(私は彼の乾いた手ぶれを言及するのは特別な意味を持っていない、いない狂気の事)
実際には、ああ、二重下線の方法は、開発者が使用するためのより多くのPythonのソースコードです
彼らはソースコードを書くとき、私たちはこの方法二重のアンダースコアを使用します。
しかし、私はできるだけ少しの開発にこのアプローチを使用することを示唆しています
これは、できるだけを使用し、なぜあなたは言うのですか?
この方法について学ぶために私たちはより良いソースを理解することができ、これは、
ブラザーズ保証
あなたは、1つのまたは2つのソースコードを読んでいない場合は、あなたの腹話術を数えます
しかし、ソースが┗山の上にオンにする必要があります| `O「|┛嘆き~~
それは非常に薄くならないことを理解しているので、さあ
方法について学びます
LEN方法
この方法は、それに非常に精通しています
時間の計算にクラスのリストの実際には、私たちの辞書ああ長
表面に書かれた)(LENされます
実際にメソッドを呼び出します--len--
通常時では、我々はこのように、この機能を実行します
l = [1, 2, 3, 4, 5] print(l.__len__()) print(len(l))
結果を愛し、2 5はそれではありません、
しかし、私は彼の方法を変更しなければならない場合
class Demo(object): def __len__(self, obj): print("我是len方法") return 1 l = Demo() print(l.__len__([1, 2, 3, 4, 5]))
(なぜ?返す書き込み要件なので、それがエラーを書き込みません)
あなたが印刷した結果、または5の事?
ありません
だから、このlenは()実行時に、それは実際には、二重下線LENメソッドを呼び出しています
ハッシュ法
実際には、同じ方法とlenの上階
このメソッドは、内部メソッドと呼ばれています--hash--
上記の書き込み1に従ってください!
アイテムシリーズ
このシリーズは、私は非常に身近な事を言いたいです
辞書
あなたは辞書がそれを呼び出すために割り当てられているかについて考えたことはありますか?
実際には、方法は、二重に下線が引かれ
いくつかの単語の男は、コードに直接、言いました
class Dic: # def __init__(self, name): # self.name = name def __getitem__(self, item): print("获取KEY", item) print(self.__dict__[item]) def __setitem__(self, key, value): print("设置一个key...", key) self.__dict__[key] = value def __delitem__(self, key): print('执行del时,我执行') self.__dict__.pop(key) def __delattr__(self, item): print('删除的时候我执行') self.__dict__.pop(item) b = Dic() b[1] = 1 b[2] = 2 del b[2] b[3] = 3 b[3] print(b.__dict__)
次のように実行結果は以下のとおりです。
设置一个key... 1 设置一个key... 2 执行del时,我执行 设置一个key... 3 获取KEY 3 3 {1: 1, 3: 3}
だから、辞書関連の操作は、実際には二重下線の適切なメソッドを呼び出しています
マスターキーのアプローチ
STR&のrepr
これらの2つの方法は、知っておくべきこと
(それがわからない場合は、ブログ港区の兄を見に戻って行くだろう)
私たちが使用している場合、それは実際には二重下線の対応するメソッドを呼び出していること
例えば
class R: def __init__(self, item): self.item = item pass s = R("ponny") print(str(s)) print(repr(s))
あなたは、彼らが実際にメモリアドレスを対応するプリントアウトされている見ることができます
<__main__.R object at 0x0548FF50> <__main__.R object at 0x0548FF50>
今、私たちは2つのアンダースコアに対応する2つのメソッドを持って
それは、これら2つの影響力の関数であるかどうかを確認
class R: def __init__(self, item): self.item = item pass def __str__(self): print(f"我是{self.item}的str方法!") return "A" def __repr__(self): print(f"我是{self.item}的repr方法!") return "B" s = R("ponny") print(str(s)) print(repr(s))
我々は、上記の文を実行すると
あなたは、このような結果を取得する必要があります
我是ponny的str方法! A 我是ponny的repr方法! B
何の説明?
これらの2つの方法の使用を説明することは確かに二重下線のPythonのメソッド内の同じ名前の呼び出しです
この方法の独自の定義のローカル空間で私たちと
ロードシーケンスによると、最初のロードは、当社の書かれています
そこで、我々は実際には二重下線の対応するメソッドを呼び出してこれらの2つの方法を説明することができます
実際のもう一つのポイントは、言いたいです
私がコメントすると、その後strのメソッドを実行します
そして、何が起こるのだろうか?
class R: def __init__(self, item): self.item = item pass # def __str__(self): # print(f"我是{self.item}的str方法!") # return "A" def __repr__(self): print(f"我是{self.item}的repr方法!") return "B" s = R("ponny") str(s) print(str(s))
結果はこれです:
我是ponny的repr方法! 我是ponny的repr方法! B
何の説明?
我々は、二重下線STRの方法がない場合は、インタープリタとき
STR法を用いる場合、この方法は、のreprをダブルアンダースコアを使用します
実際には、その後、ほとんどありません
実際には、あなたは気づいているかもしれません
これらの2つの方法は、それ以外の場合はエラーになり、値は文字列でなければなりません戻ります
(ご興味のある方は、関連する情報を確認するためにオンラインに行くことができます)
デルデストラクタ
デストラクタは、オブジェクトがメモリにリリースされたときに、自動的に実行をトリガ
それを理解するには?
私は今、そのようなコードに従事しています
class R: def __init__(self, item): self.item = item pass def __del__(self): print("我是del...") pass
私はこのクラスのために行ったとき、あなたは、何が起こるかインスタンス化されていますか?
s = R("ponny")
次のように実行結果は以下のとおりです。
我是del...
ねえ?
私はこの事を実行するには、何の方法ではありませんか?
どのようにああを行うのだろうか??
我々は、この上でその質問を置きます
私たちの後ろにインスタンス化
print文を追加します。
印刷するかを参照してください??
print("我是后面的语句")
あなたはおそらく(推測)と思うかもしれない結果A
我是后面的语句 我是del...
では、なぜ、実行のこの順序は、それですか?
以前の私たちが言った、デルはデストラクタメソッドであります
そして、メモリ内のデストラクタオブジェクトが実行自動的に解放されます
すべてPYファイルは上で実行された場合
メモリに保存されたオブジェクトは自動的に解放されます
(これは、Pythonのガベージコレクションのメカニズムが原因です)
だから、デル・メソッドをトリガーします
この方法の本質は、二重デルは、デルの方法を強調しています
だから、print文の最後に実行されます
しかし、それを
Pythonは高レベル言語であるため、この方法は、一般的に定義する必要はありません
プログラマを使用する場合は、メモリの割り当てと解放のを心配する必要はありません
この作品は、Pythonインタプリタにあるので実行します
したがって、デストラクタ関数を呼び出すはガベージコレクション時に自動的に実行されるトリガさインタプリタにより実行されます