1.假如我有个service_
开关的文件列表
这些service_
文件里面大概就是这样的
class ServiceA(object):
def __init__(self):
pass
有一个service_manager
class ServiceManager(object):
property
def service_a(self):
if not hasattr(self, '_service_a'):
self._service_a =ServiceA()
return self._service_a
但是现在有一个问题我在 service_a 想通过service_manager
调用 service_b 的方法
我现在是在 service_a 的初始化过程中
class ServiceA(object):
def __init__(self, service_manager):
self.service_manager = service_manager
但是这个样子怪怪的,而且这个样子我在 service_a 应该是无法标注 service_manager 的类型
因为会循环报错
这个样子应该怎么处理?
1
2379920898 2020-01-07 14:49:10 +08:00 1
使用函数处理字符串
|
2
2379920898 2020-01-07 14:49:15 +08:00
EASY
|
3
chenqh OP @2379920898 函数处理字符串?这是什么?
|
4
2379920898 2020-01-07 14:52:10 +08:00
敏捷开发
|
5
BingoXuan 2020-01-07 14:54:06 +08:00 1
先定义个 ServiceManagerBase 的类,定义继承 ServiceManagerBase 的类 Manager,定义 ServiceA 的类,其入参类型是 ServiceManager。
|
6
robot1 2020-01-07 15:20:40 +08:00 1
楼上没错 给 manager 加个接口类啊。这就是传说中的依赖注入吧
|
7
robot1 2020-01-07 15:23:02 +08:00
python 有个 zope 库可实现空接口
|
8
oahebky 2020-01-07 16:31:38 +08:00
出现循环的情况,跟你标没标注没有关系。
class ServiceManager(object): @ property def service_a(self): if not hasattr(self, '_service_a'): self._service_a =ServiceA(self) return self._service_a class ServiceA(object): def __init__(self, service_manager): self.service_manager = service_manager #### Usage: mgr = ServiceManager() ser_a = ServiceA(mgr) obj_1 = ser_a.service_manager.service_a 》》》 ser_a != obj_1 obj_2 = obj_1.service_manage.service_a 》》》 obj_1 == obj_2 != ser_a #### Usage: mgr = ServiceManager() ser_a1 = mgr.service_a ser_a2 = ser_a1.service_manager.service_a 》》》 ser_a1 == ser_a2 不过基本上这么设计最后都会放弃。 暂时可以先用着,用着用着或许就知道怎么重新设计了。 |
9
chenqh OP @oahebky 我知道有循环引用,但是加了 typing hint 直接会报错,运行不了,也可以不改我现在的代码,就是没有智能提示
|
10
ctrlaltdeletel 2020-01-07 19:35:52 +08:00 1
感觉现在依赖关系有点混乱
如果单纯想加上 type hint,可以结合 typing.TYPE_CHECKING 和 forwardref 试试 |
11
chenqh OP @ctrlaltdeletel 加了,但是 vscode 好像还是没有智能提示,有点郁闷
|