Python面接問題を考える-3
12915 ワード
Pythonのゴミ回収メカニズム参照カウント簡単に言えば、オブジェクトごとに1つの マーキング-クリアこれは追跡回収に基づくアルゴリズムで、主に2つの段階に分けられる:1、すべてのアクティブオブジェクトをすべてマーキングする;2、マークされていないオブジェクトを「非アクティブオブジェクト」として回収します.オブジェクトは参照によってリンクされ、オブジェクトがノードであり、参照関係がエッジであり、ルートオブジェクト(グローバル変数、呼び出しスタック、レジスタ)から構成されます.この有向図の遍歴を開始し、到達可能なオブジェクトはアクティブオブジェクトとしてマークされ、到達不可能なオブジェクトは非アクティブオブジェクトとしてマークされます.欠点:オブジェクトをクリアするたびにメモリ全体をスキャンする必要がある 世代別回収は空間的に時間を入れ替える方式で、Pythonではメモリを対象の生存時間によって3つの異なる集合(世代)に分け、若い世代(第0世代)、中年代(第1世代)、古い世代(第2世代)の3つのチェーンテーブルにそれぞれ対応し、それらのゴミ収集頻度と対象の生存時間の増大によって減少する.新しく作成されたオブジェクトはいずれも若い世代に割り当てられ、若い世代のチェーンテーブルの総数が上限に達するとPythonゴミ収集メカニズムがトリガーされ、回収可能なオブジェクトを回収し、回収されないオブジェクトは中年代に移動されます.このように、高齢者のオブジェクトは生存時間が最も長いオブジェクトです.システム全体のライフサイクルに生き残ることもできます.同時に,世代別回収はタグ消去技術の基礎に基づいている.世代別回収は同様にPythonの補助ごみ収集技術としてそれらの容器対象を処理する.
Pythonにおけるゴミ回収メカニズム
魔法の方法
メタクラス
pythonの重要な概念の一つは、すべてがオブジェクトであることであり、インスタンス化された方法を使用して定義されたクラスをインスタンス化することがよくあります.メタクラスはクラスを構築する方法であり、メタクラス->クラス->インスタンスです.Pythonの元類の2つの言葉は簡単にpythonの最も難しい知識点--元類を掌握します
サルパッチ
サルパッチ(monkey patch)は、主な機能は動的属性の置き換え、すなわちpythonコードの実行時に動的に方法、クラスを変更する方法である.しかし、パッチの存在はコードロジックを混乱させる可能性があります.詳しくは、python面接問題の詳細-monkey patch(サルパッチ)
はんしゃきこう
オブジェクト内の変数にアクセスしたり、オブジェクト内のメソッドを実行したりする必要がある場合がありますが、この変数やメソッドが存在するかどうかはわかりません.未知の変数やメソッドを理解したり操作したりするメカニズムが必要です.このメカニズムは反射と呼ばれ、いくつかの方法があります.
もちろん多くのシーンでも合わせて
ob_ref
フィールドを維持し、そのオブジェクトが現在参照されている回数を記録させ、新しい参照がそのオブジェクトを指す場合、参照カウント+1、参照が失効した場合、参照回数-1、対象の参照回数が0の場合、そのオブジェクトは回収される.欠点は主に2つあります:1、このフィールドを格納するために余分なメモリ領域を必要とします;2、「循環参照」が発生するとメモリが漏れる(この問題を解決するために、「タグ-クリア」&「世代別回収」);Pythonにおけるゴミ回収メカニズム
魔法の方法
__call__
:__call__
関数の役割は、定義されたクラスが関数形式のように呼び出されるようにすることである(呼び出し可能オブジェクト).実装機能が異なり、クラスAをaにインスタンス化し、a(パラメータ)形式で呼び出すとデフォルトでは__init__
関数の機能が実装され、私がhmh
とcs
の機能を実装したい場合は__call__
と__call__
という従来の呼び出し形式を使用します. class A(object):
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print(*args)
def hmh(self):
print("hmh")
def cs(self):
print("cs")
a = A()
a(12345)
a.hmh()
>>>12345
>>>hmh
hmh
:このメソッドは、クラスをパラメータとして受信し(このパラメータはインスタンス化時にpython解釈器によって自動的に提供される)、インスタンスを生成し、インスタンスを作成する、つまりクラスインスタンスを構築する役割を果たす.そしてcs
は、インスタンスを構築した後、インスタンスを初期化する魔法の方法である.a.hmh()
:オブジェクトを破棄するための構造的役割を果たすが、一般的にpythonのメモリメカニズムはオブジェクトを破棄する作業に適しているし、手動で使用することもできるa.cs()
この作業を行う.メタクラス
pythonの重要な概念の一つは、すべてがオブジェクトであることであり、インスタンス化された方法を使用して定義されたクラスをインスタンス化することがよくあります.メタクラスはクラスを構築する方法であり、メタクラス->クラス->インスタンスです.Pythonの元類の2つの言葉は簡単にpythonの最も難しい知識点--元類を掌握します
サルパッチ
サルパッチ(monkey patch)は、主な機能は動的属性の置き換え、すなわちpythonコードの実行時に動的に方法、クラスを変更する方法である.しかし、パッチの存在はコードロジックを混乱させる可能性があります.詳しくは、python面接問題の詳細-monkey patch(サルパッチ)
はんしゃきこう
オブジェクト内の変数にアクセスしたり、オブジェクト内のメソッドを実行したりする必要がある場合がありますが、この変数やメソッドが存在するかどうかはわかりません.未知の変数やメソッドを理解したり操作したりするメカニズムが必要です.このメカニズムは反射と呼ばれ、いくつかの方法があります.
__new__
:__init__
対象に変数やメソッドがあるかどうかを判断します. class Hello(object):
name = "hmh"
def say_hello(self, sentence):
print("Hello, %s" % self.name)
hello = Hello()
print(hasattr(hello, "name"))
>>>
True
__del__
:__del__
オブジェクト内の変数またはメソッドを取得します.このうちhasattr
はデフォルト値を返します.デフォルトでは対応する属性がない場合、例外がトリガーされますhasattr(object, name)
. class Hello(object):
name = "hmh"
def say_hello(self, sentence):
print("Hello, %s" % self.name)
hello = Hello()
print(getattr(hello, "name"))
>>>
hmh
getattr
:getattr(object, name, [, default])
属性値を設定するためのものであり、必ずしも存在しない. class HMH(object):
name = "hmh"
hmh = HMH()
setattr(hmh, "age", 23)
print(hmh.age)
>>>
23
もちろん多くのシーンでも合わせて
default
使います. class HMH(object):
name = "hmh"
hmh = HMH()
print(getattr(hmh, "name"))
setattr(hmh, "name", "pluto")
print(hmh.name)
>>>
hmh
pluto
```
* `delattr`:`delattr(object, name)`
。
```python
class HMH(object):
name = "hmh"
age = 23
hmh = HMH()
print(getattr(hmh, "name"))
delattr(hmh, "name")
print(hmh.name)
>>>
hmh
File "/Users/houminghui/PycharmProjects/test_tensorflow/l_test.py", line 256, in <module>
delattr(hmh, "name")
AttributeError: name