>  기사  >  백엔드 개발  >  Python에서 지연된 작업을 구현하는 방법

Python에서 지연된 작업을 구현하는 방법

王林
王林앞으로
2023-05-16 17:16:122037검색

Python은 지연된 연산을 구현합니다

python 지연된 연산을 구현하려면 시간을 적용한 다음 시간의 sleep 메서드를 사용해야 합니다

예를 들어 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의 할당 작업을 수행할 때 이러한 지연 클래스가 없으면 소개하려는 클래스를 인스턴스화하기 위해 이 연산자가 호출됩니다. , 먼저 인스턴스화합니다. 즉, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제