【发布时间】:2022-01-17 15:45:46
【问题描述】:
我正在为一些 REST API 编写 Python 包。为了更轻松地操作从 API 获得的对象的状态,我想存储对我的 API 客户端实例的静态引用。假设我有一个文件user.py:
class User:
_client: Client = None
所以当客户端第一次成功认证时,我更新引用:
class Client:
def authenticate(self):
...
User._client = self
这发生在我的client.py 文件中。现在我可以从client.py 中声明的任何函数成功访问User._client,但是当我从另一个模块尝试同样的事情时,User._client 仍然是None。
假设这是我的文件夹结构
└── my_api_client
├── __init__.py
├── client.py
├── search.py
└── user.py
然后当我从search.py 中的函数调用User._client 时,我得到None 而不是对当前客户端实例的引用。
我在创建一个演示此问题的最小工作示例时遇到了麻烦,所以也许我只是在导入时弄乱了一些东西。我认为,如果我更好地理解如果我从另一个模块导入一个类以及对该类的静态属性的引用是否在所有模块之间共享,那将真的很有帮助。如果真是这样,那我做错了什么?
【问题讨论】:
-
您能否发布一个 search.py 的代码示例,看看您是如何调用的以及您的导入是什么?
-
您是否有理由特别想动态更改静态类变量?从提供的行来看,我假设在连接时创建了一个使用客户端对象的
User-object。因此,需要对userobject._client进行分配,而不是使用类变量。 -
我没有设法在我正在开发的应用程序之外重现该问题,以上所有内容只是对我正在做的事情的简化抽象。我会很感激任何关于在使用类变量和模块导入时 Python 可能出错的提示
-
@JonathanWeine 我想要类而不是实例上的客户端引用,因此我不必每次创建
User实例时都将客户端引用传递给构造函数。在这种情况下这可能是可行的,但我有层级的类会自动反序列化,并且每次创建实例时都注入客户端引用非常困难。 -
我在这里有点摸不着头脑,但听起来你正在为用户实现类似单例模式的东西。如果是这种情况(这通常不是最佳选择,尤其是如果您想在某个时候并行执行操作),您可以使用
globalUser 实例来代替修改静态类变量。
标签: python python-module class-variables