我正在尝试创建一个类,它映射到一个mongoDB集合。
我的代码如下所示:
class Collection:
_collection = get_collection() # This seems not working
@classmethod
def get_collection(cls):
collection_name = cls.Meta.collection_name if cls.Meta.collection_name \
else cls.__name__.lower()
collection = get_collection_by_name(collection_name) # Pseudo code, please ignore
return collection
class Meta:
collection_name = 'my_collection'
我遇到了一种情况,需要为类变量_collection
分配get_collection
的返回值。我也尝试过_collection = Collection.get_collection()
,它似乎也不起作用。
作为一个解决方案,我在子类中子类Collection
并设置了_collection
的值.
想知道这方面的任何简单解决方案。
提前感谢
发布于 2018-02-12 06:45:53
正如DeepSpace所提到的,在这里:
class Collection:
_collection = get_collection() # This seems not working
@classmethod
def get_collection(cls):
# code that depends on `cls`
调用get_collection
方法时尚未定义它。但是在方法定义之后移动这一行也不起作用,因为方法依赖于Collection
类(作为cls
传递给方法),它本身不会在class Collection:
语句的正文结束之前定义。
这里的解决方案是等到定义了类来设置这个属性。由于它看起来像是要子类的基类,更好的解决方案是使用元类:
class CollectionType(type):
def __init__(cls, name, bases, attrs):
super(CollectionType, cls).__init__(name, bases, attrs)
cls._collection = cls.get_collection()
# py3
class Collection(metaclass=CollectionType):
# your code here
# py2.7
class Collection(object):
__metaclass__ = CollectionType
# your code here
但是,请注意,如果Collection
实际上继承了另一个已经具有自定义元类(即Django、Model
类或等效类)的类,则需要使CollectionType
成为该元类的子类,而不是type
的子类。
发布于 2018-02-12 06:25:26
代码中存在一些设计/语法错误。
_collection = get_collection()
执行时,还没有定义get_collection
。事实上,还没有定义整个Collection
类。get_collection_by_name
在任何地方都没有定义。编辑 OP更新了这个问题,因此以下几点可能不再相关。
collection = get_collection(collection_name)
应该是
collection = cls.get_collection(collection_name)
get_collection
,有时则不传递,但是get_collection
的签名从不接受参数。get_collection
将导致无限递归。你必须退一步,重新考虑你的班级的设计。
https://stackoverflow.com/questions/48748617
复制相似问题