Python面接問題を考える-3

12915 ワード

Pythonのゴミ回収メカニズム
  • 参照カウント簡単に言えば、オブジェクトごとに1つのob_refフィールドを維持し、そのオブジェクトが現在参照されている回数を記録させ、新しい参照がそのオブジェクトを指す場合、参照カウント+1、参照が失効した場合、参照回数-1、対象の参照回数が0の場合、そのオブジェクトは回収される.欠点は主に2つあります:1、このフィールドを格納するために余分なメモリ領域を必要とします;2、「循環参照」が発生するとメモリが漏れる(この問題を解決するために、「タグ-クリア」&「世代別回収」);
  • マーキング-クリアこれは追跡回収に基づくアルゴリズムで、主に2つの段階に分けられる:1、すべてのアクティブオブジェクトをすべてマーキングする;2、マークされていないオブジェクトを「非アクティブオブジェクト」として回収します.オブジェクトは参照によってリンクされ、オブジェクトがノードであり、参照関係がエッジであり、ルートオブジェクト(グローバル変数、呼び出しスタック、レジスタ)から構成されます.この有向図の遍歴を開始し、到達可能なオブジェクトはアクティブオブジェクトとしてマークされ、到達不可能なオブジェクトは非アクティブオブジェクトとしてマークされます.欠点:オブジェクトをクリアするたびにメモリ全体をスキャンする必要がある
  • 世代別回収は空間的に時間を入れ替える方式で、Pythonではメモリを対象の生存時間によって3つの異なる集合(世代)に分け、若い世代(第0世代)、中年代(第1世代)、古い世代(第2世代)の3つのチェーンテーブルにそれぞれ対応し、それらのゴミ収集頻度と対象の生存時間の増大によって減少する.新しく作成されたオブジェクトはいずれも若い世代に割り当てられ、若い世代のチェーンテーブルの総数が上限に達するとPythonゴミ収集メカニズムがトリガーされ、回収可能なオブジェクトを回収し、回収されないオブジェクトは中年代に移動されます.このように、高齢者のオブジェクトは生存時間が最も長いオブジェクトです.システム全体のライフサイクルに生き残ることもできます.同時に,世代別回収はタグ消去技術の基礎に基づいている.世代別回収は同様にPythonの補助ごみ収集技術としてそれらの容器対象を処理する.

  • Pythonにおけるゴミ回収メカニズム
    魔法の方法
  • __call__:__call__関数の役割は、定義されたクラスが関数形式のように呼び出されるようにすることである(呼び出し可能オブジェクト).実装機能が異なり、クラスAをaにインスタンス化し、a(パラメータ)形式で呼び出すとデフォルトでは__init__関数の機能が実装され、私がhmhcsの機能を実装したい場合は__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