将方法容器添加到另一个类

时间:2013-08-09 13:45:22

标签: python api rest instantiation

让我们考虑一下我有一些模型类:

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({.. 。}))

2 个答案:

答案 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前缀进行细分,您不必创建多个实例。