Python 设置类变量值,由类方法返回的值
我试图创建一个映射到mongoDB集合的类 我的代码如下所示:Python 设置类变量值,由类方法返回的值,python,python-3.x,class,Python,Python 3.x,Class,我试图创建一个映射到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 \ els
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'
我遇到了一种情况,我需要使用返回值get\u collection
来分配类变量\u collection
。
我还尝试了\u collection=collection.get\u collection()
,这似乎也不起作用
作为一种解决方法,我将集合
子类化,并在子类中设置\u集合
的值
我想知道这方面的简单解决方案
提前感谢您的代码中存在一些设计/语法错误
- 当执行行
时,\u collection=get\u collection()
尚未定义。事实上,整个get\u collection
类尚未定义集合
- 未在任何位置定义按名称获取集合
应该是collection=get\u collection(collection\u name)
collection=cls.get\u collection(collection\u name)
- 有时将参数传递给
,有时不传递,但是get\u collection
的签名从不接受参数get\u collection
- 调用
将导致无限递归get\u collection
您必须后退一步,重新考虑类的设计。代码中存在一些设计/语法错误
- 当执行行
时,\u collection=get\u collection()
尚未定义。事实上,整个get\u collection
类尚未定义集合
- 未在任何位置定义按名称获取集合
应该是collection=get\u collection(collection\u name)
collection=cls.get\u collection(collection\u name)
- 有时将参数传递给
,有时不传递,但是get\u collection
的签名从不接受参数get\u collection
- 调用
将导致无限递归get\u collection
你必须退后一步,重新考虑你的课程设计。正如DeepSpace提到的,这里:
class Collection:
_collection = get_collection() # This seems not working
@classmethod
def get_collection(cls):
# code that depends on `cls`
调用时,get\u集合
方法尚未定义。但是在方法定义之后移动这一行也不会起作用,因为该方法依赖于集合
类(作为cls
传递给该方法),而该类本身在类集合:
语句体结束之前不会被定义
这里的解决方案是等待定义类来设置该属性。因为它看起来像是一个要子类化的基类,所以更好的解决方案是使用元类:
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
实际上继承自另一个已经拥有自定义元类的类(即DjangoModel
class或等效类),则需要将CollectionType
作为该元类的子类,而不是像DeepSpace提到的type
的子类,如下所示:
class Collection:
_collection = get_collection() # This seems not working
@classmethod
def get_collection(cls):
# code that depends on `cls`
调用时,get\u集合
方法尚未定义。但是在方法定义之后移动这一行也不会起作用,因为该方法依赖于集合
类(作为cls
传递给该方法),而该类本身在类集合:
语句体结束之前不会被定义
这里的解决方案是等待定义类来设置该属性。因为它看起来像是一个要子类化的基类,所以更好的解决方案是使用元类:
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
实际上继承了另一个已经拥有自定义元类的类(即DjangoModel
class或等效类),那么当行_Collection=get_Collection()时,需要将CollectionType
作为该元类的子类,而不是type执行时,尚未定义get_集合。“=>并且集合
类也未定义,因此在方法定义之后移动此行将不起作用either@DeepSpace我尝试将语句\u collection=get\u collection()
移动到方法定义之后。它会引发TypeError:“classmethod”对象不可调用
@DeepSpace感谢好友“当执行行_collection=get_collection()时,尚未定义get_collection。”=>而且集合
类也不是,因此在方法定义之后移动此行将不起作用either@DeepSpace我尝试将语句\u collection=get\u collection()
移动到方法定义之后。它引发了TypeError:'classmethod'对象不可调用
@DeepSpace感谢buddyNotice一个好的linter会警告您,get\u collection()
在您放置它的位置尚未定义。很抱歉,将函数名get\u collection\u by\u name
输入错误。更新了问题,但是,什么是get\u collection\u by\u name()
?真正简单的方法是在类定义之后立即赋值,即将collection.get\u collection()
作为collection
定义之后的下一行代码。但是我想Bruno的方法是有道理的。请注意,一个好的linter会警告您,get\u collection()
在放置它的位置尚未定义。很抱歉,错误地键入了函数名get\u collection\u by\u name
为get\u collection
。更新