Python 设置类变量值,由类方法返回的值

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

我试图创建一个映射到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'
我遇到了一种情况,我需要使用返回值
get\u collection
来分配类变量
\u collection
。 我还尝试了
\u collection=collection.get\u collection()
,这似乎也不起作用

作为一种解决方法,我将
集合
子类化,并在子类中设置
\u集合
的值

我想知道这方面的简单解决方案


提前感谢

您的代码中存在一些设计/语法错误

  • 当执行行
    \u collection=get\u collection()
    时,
    get\u collection
    尚未定义。事实上,整个
    集合
    类尚未定义

  • 未在任何位置定义按名称获取集合

编辑OP更新了问题,因此以下几点可能不再相关

  • 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
    尚未定义。事实上,整个
    集合
    类尚未定义

  • 未在任何位置定义按名称获取集合

编辑OP更新了问题,因此以下几点可能不再相关

  • 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
实际上继承自另一个已经拥有自定义元类的类(即Django
Model
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
实际上继承了另一个已经拥有自定义元类的类(即Django
Model
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
。更新