Python中的SOLID原则和导入

2024-06-25 22:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常有这个问题

在我的项目中,我有一些控制代码流的用户输入

因此,假设用户将选择水果是香蕉还是苹果,代码将执行正确的操作

我尝试在代码中应用坚实的原则

所以我为水果制作了一个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,这样以后就可以调用一个方法来获取所有子类(实现接口的所有类)

但是我想知道导入它们的子类是什么

是否存在设计缺陷?

我在哪里丢失它?

如果我盲目地导入*会更好吗?这是如何正确完成的?


Tags: 文件用户frompyimportappledefjuice