ホームページ  >  記事  >  バックエンド開発  >  Pythonで遅延操作を実装する方法

Pythonで遅延操作を実装する方法

王林
王林転載
2023-05-16 17:16:122091ブラウズ

Python は遅延操作を実装します

Python で遅延操作を実装したい場合は、時間を適用してから、time の sleep メソッドを使用する必要があります

たとえば、次のように書きたいと思います。 1 秒に 1 回印刷を遅らせる操作

import time
for i in range(0, 10):
    time.sleep(1)
    print(i)

Python の遅延読み込み問題

Python の遅延読み込みはよく使用されます。主なアイデアは、導入されるクラスのインスタンス化を遅らせて保存することです。初期化にはある程度の時間とスペースが必要です。

このアイデアは、ORM の QuerySet や認証ミドルウェアの request.user など、Django でも広く使用されています。これらはすべて遅延読み込みのアイデアを使用しています。

この記事では、例を通じて遅延読み込みのアイデアを分析します。

遅延読み込みの実装の基本的な考え方は、クラスを作成し、インスタンス化する必要があるクラスをそれに渡すことです。この時点で、クラスは遅延読み込みクラスになります。適用すると、クラスは遅延読み込みクラスになります。 , この遅延ロードクラスをインスタンス化しましたが、参照したいクラスがインスタンス化されていません。

次のように:

class User(object):
    def __init__(self):
        self.name = 'haibo'
        self.age = 23
def test():
    return User()
#初始化该延迟加载类
user = CommonLazyObject(lambda :test())
#此时我们要引用的类才执行
user.age = 28

上で User クラスを定義しました。これはプログラム内で参照したいクラスであり、CommonLazyObject は定義した遅延読み込みクラスです (これについては後で詳しく説明します)。 )。クラスを遅延ロードすることで、事前にクラスを初期化する必要がなく、以下の user.age などの操作を実行したい場合にのみインスタンス化されます。

それでは、遅延読み込みクラスの具体的な実装プロセスを見てみましょう。

考え: 私たちのインスタンス化操作は、最終的には __getattr__ や __setattr__ などの演算子に集約されます。したがって、これらの演算子を定義している限り、これらの遅延を実現できます。つまり、これらの期間のみ実行されます。操作 インスタンス化したいクラスを実際にインスタンス化できますか:

#建立一个空的对象
empty = object()
#一个装饰器,对__getattr__进行装饰,使得其可以进行类的实例化
def proxy_getattr(func):
    def wrapper(self,*args):
        if self._wrapper is empty:
            self._init_object()
        return func(self._wrapper,*args)
    return wrapper
class LazyObject(object):
    def __init__(self):
        self._wrapper = empty
    __getattr__ = proxy_getattr(getattr)
        #进行赋值操作的时候,看是实例化类,还是对类的实例进行赋值操作。因为下面我们要进行实例化类的操作。
    def __setattr__(self, key, value):
        if key == '_wrapper':
            self.__dict__['_wrapper'] = value
        else:
            if self._wrapper is empty:
                self._init_object()
            setattr(self._wrapper,key,value)
        #在子类中,你应该重新定义它,你通过它,来实现你想要通过何种方式实例化你的类。
    def _init_object(self):
        pass

まず、上記の __setattr__ を見てください。user.age=28 の代入操作を実行するとき、これは、必要なクラスの場合、operator と呼ばれます。導入するものは遅延クラスではインスタンス化されません。最初にインスタンス化されます。つまり、self._init_object を呼び出して _wrapper に割り当てます。インスタンス化が完了すると、インスタンスの __setattr__ メソッドがすぐに実行されます。

同様に、__getattr_ も同様です。user.name を出力したい場合は、まず参照先のクラスがインスタンス化されているかどうかを確認する必要があります。インスタンス化されていない場合は、インスタンス化してから、そのインスタンスの __getattr__ を呼び出します。 。

さて、インスタンス化を実装するサブクラスを見てみましょう:

class CommonLazyObject(LazyObject):
    def __init__(self,func):
        self.__dict__['_wrapperfunc'] = func
        super(CommonLazyObject,self).__init__()
    def _init_object(self):
        self._wrapper = self._wrapperfunc()

このサブクラスのインスタンス化プロセスは非常に簡単で、直接呼び出すだけです。

以上がPythonで遅延操作を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。