让我们考虑一下我有一些模型类:
class UserModel(Model):
title = StringType()
class ItemModel(Model):
...
这里的模型只是一个验证器(Schematics)。但我有一个数据库(MongoDB),我想向Model添加一些操作。
class CRUDOperations(object):
def get(self):
return "Get Method"
我想以某种方式将CRUDOperations“插入”到模型中,并希望它像:UserModel.crud.get()
一样被访问,即不创建实例。我试图这样做但是失败了,这有什么常见的做法吗?
from schematics.models import Model
from schematics.types import StringType
class CRUDOperations(object):
def __init__(self, model_cls):
# Upd. i need access to model_cls to get
# some class attributes like collection name, database name etc.
self.model_cls = model_cls
@classmethod
def get_crud(cls, model_cls):
cls.model_cls = model_cls
return cls
@classmethod
def get(cls, oid=None):
# and if i'll use mongo here i'll need to access pymongo driver
# like this: cls.model_cls._col_.find_one({"_id": oid})
return 'test ok! {}'.format(cls.model_cls)
class CRUDModel(Model):
__crud__ = None
def __init__(self, *args, **kwargs):
super(CRUDModel, self).__init__(*args, **kwargs)
print "CRUDModel.__init__"
self.__crud__ = CRUDOperations(self).get_crud()
@classmethod
def crud(cls):
if cls.__crud__ is None:
cls.__crud__ = CRUDOperations.get_crud(cls)
return cls.__crud__
class TestModel(CRUDModel):
title = StringType()
def main():
print TestModel.crud
print TestModel.crud.get()
if __name__ == '__main__':
main()
是的,我知道有很多错误,但我尝试了很多方法,所以它只是代码来显示我拥有的和我需要做的事情(为模型调用crud操作,如TestModel.crud.create({.. 。}))
答案 0 :(得分:0)
CRUDOperations
的{{1}}方法self
将__init__
实例化。所以它们不能作为CRUDModel
上的类操作来访问。
您应该执行以下操作:
CRUDModel
另外,使用双下划线命名变量是不好的做法。双下划线用于语言保留字。使用单个下划线。
答案 1 :(得分:0)
我会使CRUDOperations
成为常规对象(没有类方法),这需要CRUDModel
个实例进行初始化。
然后在@property
上通过传递{{1}在内部变量CRUDModel
和_crud_
实例中初始化CRUDOperations
crud 到它,从那时起就返回它。
这样你就可以将这些函数分离到self
命名空间,这就是你想要的。
.crud
如果您不想创建新实例以获得it's tricky since i want to have classmethods to have access w/o make instance.
,那么您可以将所有.crud.
方法重命名为前缀CRUDOperations
,并使实例函数接收一个crud_
参数。
然后使用self
类作为mixin,让CRUDOperations
继承它。然后,您的函数仍将使用CRUDModel
前缀进行细分,您不必创建多个实例。