如何推迟执行功能?

时间:2018-09-25 14:07:31

标签: python python-2.7

我正在Python 2.7中实现以下类:

class MyClass(object):
    def do_something(self):
        """
        do something here
        """

class MyClassManager(object):
    def get_my_class_obj(self):
        """read my_class_obj from db"""
        return instance # instance has type MyClass


class MyClassUser(object):
    my_class_obj = new MyClass() # this is a class variable

主要:

MyClassUser.my_class_obj = MyClassManager().get_my_class_obj()
"""
do a lot of different things else in main
"""

在其他地方:

"""only when some condition happens"""
MyClassUser.my_class_obj.do_something()

是否有一种方法可以将get_my_class_obj中的read obj(从MyClassManager中的db读取)过程推迟到实际调用obj.do_something方法之前?前提是我必须在开始时致电MyClassManager.get_my_class_obj进行一些设置。假设情况是在Web服务器的上下文中,do_something仅在有某些请求时才被调用,但我需要先对其进行设置

1 个答案:

答案 0 :(得分:0)

一个非常快速和肮脏的,愚蠢的可能的解决方案(当然不是我将如何设计它,而是无论如何)。本示例假定您的对象只有一个ID(数据库主键)和一个名称(存储在db中)。

import functools

class MyClassManager(object):
    def get(self, object_id):
        return MyClass(object_id)

    def load(self, object):
        obj.name = self.get_from_db(object.id)

def autoload(func):
    @functools.wraps(func)
    def wrapper(self, *args, **kw):
        self._load()
        return func(self, *args, **kw)
    return wrapper 

class MyClass(object):
    def __init__(self, id, name=None):
        self.id = id
        self._name = name
        self._loaded = name is not None

    def _load(self):
        if self._loaded:
            return
        MyManager.load(self)

    @property
    @autoload
    def name(self):
        return self._name

    @autoload
    def do_something(self):
        # your code here

但是,实际上,如果您是初学者,则不要这样做(并且您不会问自己是否是初学者),请改用现有的有效ORM。当然,除非出于教育目的,否则,您可能会学到很多东西,或者在绝望中放弃-或两者都;-)