Python代码结构:如何导出类而非模块以适配Ruby开发者习惯?
刚从Ruby转Python的话,确实会觉得Python的导入写法有点“啰嗦”,不过通过几个小配置就能改成你习惯的风格,我来一步步说清楚:
实现更简洁的导入方式
1. 让controllers.UserController()成为可能
Python的目录要被识别为包,需要在controllers目录下创建一个__init__.py文件(可以是空文件,但我们要利用它来简化导入)。
在<project root>/controllers/__init__.py中添加以下代码:
# 从当前包的user_controller模块导入UserController类 from .user_controller import UserController
这样一来,外部代码就可以这样导入和实例化:
import controllers controller_instance = controllers.UserController() # 或者更简洁的写法 from controllers import UserController controller_instance = UserController()
这就和你习惯的Ruby模块调用方式很接近了。
2. 直接使用UserController()
如果想完全省略模块前缀,直接导入类本身,可以直接从具体模块导入:
from controllers.user_controller import UserController controller_instance = UserController()
如果已经在controllers/__init__.py里导入了UserController,也可以用from controllers import UserController来实现同样的效果。
Python里的“导出”类逻辑
Ruby里有明确的导出机制,但Python的逻辑更直接:模块(.py文件)里的所有类、函数默认都是可以被外部导入的。不过如果你想明确指定哪些类是对外暴露的(类似Ruby的导出),可以在模块里定义__all__变量。
比如在<project root>/controllers/user_controller.py中:
# 指定当使用`from controllers.user_controller import *`时,会导入的内容 __all__ = ["UserController"] class UserController: def index(self): # 你的业务逻辑 print("User index page") # 这个类不会被`import *`导入,相当于“私有” class _InternalHelper: pass
这样,当别人用from controllers.user_controller import *时,只会拿到UserController,而_InternalHelper(通常用下划线开头表示私有)不会被导入,达到类似“导出指定类”的效果。
内容的提问来源于stack exchange,提问作者Niels B.
相关产品推荐
相关产品推荐

