我正在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
仅在有某些请求时才被调用,但我需要先对其进行设置
答案 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。当然,除非出于教育目的,否则,您可能会学到很多东西,或者在绝望中放弃-或两者都;-)