python面接問題-2018.1.30

2295 ワード

質問:単一のモデルをどのように実現しますか?

  • はnew法によって単一のモードを実現する.
  • class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    

    バリエーション:
    class Singleton(object):
        _instance = None
    
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    
  • は、装飾器によって一例のモード
  • を実現する.
    from functools import wraps
    
    
    def singleton(cls):
        instances = {}
    
        @wraps(cls)
        def wrapper(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
    
        return wrapper
    
  • は、クラスオブジェクトを作成するクラスであるため、クラスオブジェクトがインスタンスオブジェクトを作成するときに必ずcallメソッドが呼び出されるため、callを呼び出すときに常に1つのインスタンスのみが作成されることを保証するメタクラスによって単一のモードを作成します.
  • class Singleton(type):
        def __call__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
                return cls._instance
    
    
    class Foo(object):
        __metaclass__ = Singleton
    
  • は、属性を共有することによって(このようにして実現されるが、2つのオブジェクトが同じ属性を持っているだけで、インスタンス化後、one is twoはFalseを返す)、すべてのインスタンスのdictを同じ辞書に指向し、インスタンスが同じ方法と属性を共有する.任意のインスタンスの名前プロパティの設定は、initで変更しても直接変更しても、すべてのインスタンスが影響を受けます.ただし、インスタンスのidは異なります.クラスインスタンスが属性を共有できることを保証しますが、サブクラスと共有しません.
  • class Singleton(object):
        _state = {}
    
        def __new__(cls, *args, **kwargs):
            orig = super(Singleton, cls).__new__(cls, *args, **kwargs)
            orig.__dict__ = cls._state
            return orig
    
  • モジュールを使用すると、Pythonのモジュールは天然の単例モードである.モジュールは最初の導入時に生成されるからである.pycファイルは、2回目のインポート時に直接ロードする.pycファイルは、モジュールコードを再度実行しません.したがって,関連する関数とデータを1つのモジュールに定義するだけで,単一のオブジェクトを得ることができる.もし私たちが本当に単一のクラスがほしいなら、
  • を考えてみましょう.
    # singleton.py
    class Singleton(object):
        def foo(self):
            pass
    
    
    my_singleton = Singleton()
    

    バリエーション:
    # singleton.py
    import sys
    
    
    class Singleton(object):
        pass
    
    
    sys.modules[__name__] = Singleton()