我经常有这个问题
在我的项目中,我有一些控制代码流的用户输入
因此,假设用户将选择水果是香蕉还是苹果,代码将执行正确的操作
我尝试在代码中应用坚实的原则
所以我为水果制作了一个Juicable
接口,它可以给我果汁
# fruits/juicable.py
from abc import ABC, abstractmethod
class Juicable(ABC):
@abstractmethod
def squeeze(self):
pass
现在我在一个名为banana.py的文件中制作水果
# fruits/banana.py
from fruits.juicable import Juicable
class Banana(Juicable):
def squeeze(self):
print('Banana juice in the glass')
我在一个名为apple.py的文件中制作了另一个水果
# fruits/apple.py
from fruits.juicable import Juicable
class Apple(Juicable):
def squeeze(self):
print('Apple juice in the glass')
当然,所有制作果汁的水果都将实现可榨汁接口
在另一个文件中,我想制作果汁
# bar/bartender.py
from fruits.juicable import Juicable
def make_juice(fruit: Juicable):
fruit.squeeze
根据用户输入,我通常以编程方式导入正确的Python模块
例如fruits/banana.py
如果用户选择了香蕉,我做一个Banana()
并从bar/bartender.py
调用make_juice()
这是因为如果我将程序构建为可执行文件,则没有文件。。。所以它不起作用
为了解决这个问题,我导入了所有的可榨汁的内容,然后根据用户的输入调用正确的内容
但这打破了依赖倒置原则
High-level modules should not depend on low-level modules. Both should depend on abstractions.
对吧?
加入
from fruits.banana import banana
from fruits.apple import apple
对于更高级别的模块,每次添加新的可榨汁的
这也打破了单一责任原则
当我想向用户列出所有果汁饮料时出现
首先我用os.listdir
列出所有果汁饮料,因为我知道它们在水果目录中。(这似乎是错的!)
那么1号也有同样的问题。如果我制作了一个可执行文件,就没有文件了。因此,我需要再次从更高级别的模块导入它们中的每一个。并从Juicable
类调用__subclasses__()
以查找所有可榨汁的内容
在其他语言中,您只需调用类似的subclasses()
方法即可,但我不知道在其他语言中导入是如何工作的
在Python中。您需要导入文件并首先加载所有Juicables
,这样以后就可以调用一个方法来获取所有子类(实现接口的所有类)
但是我想知道导入它们的子类是什么
是否存在设计缺陷?
我在哪里丢失它?
如果我盲目地导入*会更好吗?这是如何正确完成的?
目前没有回答
相关问题 更多 >
编程相关推荐