关于 py 设计的一些问题

2020-01-07 14:44:53 +08:00
 chenqh

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 的类型
因为会循环报错
这个样子应该怎么处理?

2583 次点击
所在节点    Python
12 条回复
2379920898
2020-01-07 14:49:10 +08:00
使用函数处理字符串
2379920898
2020-01-07 14:49:15 +08:00
EASY
chenqh
2020-01-07 14:51:32 +08:00
@2379920898 函数处理字符串?这是什么?
2379920898
2020-01-07 14:52:10 +08:00
敏捷开发
BingoXuan
2020-01-07 14:54:06 +08:00
先定义个 ServiceManagerBase 的类,定义继承 ServiceManagerBase 的类 Manager,定义 ServiceA 的类,其入参类型是 ServiceManager。
robot1
2020-01-07 15:20:40 +08:00
楼上没错 给 manager 加个接口类啊。这就是传说中的依赖注入吧
robot1
2020-01-07 15:23:02 +08:00
python 有个 zope 库可实现空接口
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


不过基本上这么设计最后都会放弃。
暂时可以先用着,用着用着或许就知道怎么重新设计了。
chenqh
2020-01-07 19:20:30 +08:00
@oahebky 我知道有循环引用,但是加了 typing hint 直接会报错,运行不了,也可以不改我现在的代码,就是没有智能提示
ctrlaltdeletel
2020-01-07 19:35:52 +08:00
感觉现在依赖关系有点混乱
如果单纯想加上 type hint,可以结合 typing.TYPE_CHECKING 和 forwardref 试试
chenqh
2020-01-07 19:39:02 +08:00
@ctrlaltdeletel 加了,但是 vscode 好像还是没有智能提示,有点郁闷
chenqh
2020-01-10 09:45:07 +08:00
@robot1 刚刚有想了下, 加个接口类,这样也没有智能提示呢,这样和我现在没有区别呀

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

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

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

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

© 2021 V2EX