在 Python 里面把 module 设置成类的变量有什么问题吗?

2020-09-01 09:35:44 +08:00
 chenqh

我用的是 tornado

我定义了一个 HandlerBase

from proj import consts, models, exceptions
from tornado import web
class HandlerBase(web.RequestHandler):
   f_consts= consts
   f_models = models
   f_exceptions = exceptions

这个样子是有什么问题吗?

我的目的是因为

基本上 Handler 都需要用到这些 module,

因为不知道这么做有什么问题,我现在只在测试里面这么写了

1379 次点击
所在节点    Python
6 条回复
hareandlion
2020-09-01 09:47:05 +08:00
被 import 的“models”是个单例对象,作为 HandlerBase 中的类变量,被多个`HandlerBase`同时访问时可能造成内存泄漏,如果已经做过相关处理,或者 models 是公共数据,本就允许这样使用,那没问题
fasionchan
2020-09-01 09:49:14 +08:00
一般没有什么问题。但是,如果这些变量是描述符(descriptor,实现了__get__ __set__ __del__ 魔术方法)的话,属性查找行为需要留意。具体可以研究下 Python 类机制以及数据描述符的特性:

https://www.imooc.com/read/76/article/1928
chenqh
2020-09-01 09:59:34 +08:00
@hareandlion models 就是一个 module
下面的文件是这样的结构

```
model_user.py
model_user_token.py
model_log.py
__init__.py
```
Hieast
2020-09-02 23:40:43 +08:00
首先虽然你描述用的是 module,但是 3l 的例子说明其实你 import 的是 package 包,这里概念有问题。

另外就算技术上没有问题,但是业务上为什么要这么做?
假如业务会增长,你的 consts, models, exceptions 肯定要根据业务领域再次分成不同的包,但是 HandlerBase 应该是整个项目通用的,这里有矛盾。
假如业务不会增长,本来也没有几个 handler,直接导入也不复杂吧?
chenqh
2020-09-03 09:52:20 +08:00
@Hieast 就是为了导入呀
xchaoinfo
2020-09-04 16:11:18 +08:00
为了导入方便的话, 在 __init__ 重新定义 __all__ , 然后 from xxx import *

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX