Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建工厂类_Python_Class_Factory - Fatal编程技术网

Python 创建工厂类

Python 创建工厂类,python,class,factory,Python,Class,Factory,作业包含以下说明: 第二部分-工厂级 这个类充当其他具体类(如Orange和Apple)的基类。正如标题所暗示的,这个类也将作为那些派生类的工厂。这 类应具有以下方法: •uuu初始(自我) o此方法主要是占位符。调试时调用消息时打印消息。 •价格(自身) o返回项目的价格。 o这也是供派生类使用的占位符。它只需要返回0。 •准备(自我) o此方法是供派生类使用的占位符。 o在派生类中,此方法充当封装复杂过程的外观 用于准备水果。 **•订购水果(水果型)#注意不要“自我” o该方法作为制造水果

作业包含以下说明:

第二部分-工厂级
这个类充当其他具体类(如Orange和Apple)的基类。正如标题所暗示的,这个类也将作为那些派生类的工厂。这 类应具有以下方法:
•uuu初始(自我)
o此方法主要是占位符。调试时调用消息时打印消息。
•价格(自身)
o返回项目的价格。
o这也是供派生类使用的占位符。它只需要返回0。
•准备(自我)
o此方法是供派生类使用的占位符。
o在派生类中,此方法充当封装复杂过程的外观
用于准备水果。
**•订购水果(水果型)#注意不要“自我”
o该方法作为制造水果对象的工厂方法。
o此方法应该是静态的,因此请使用@staticmethod decorator标记它。
o以下是启动工厂的流程:
▪ 确保fruit_类型为字符串,并修剪并将其转换为小写
▪ 创建字符串调用的类型的对象
•如果是“橙色”:
o水果=橙色()
▪ 创建水果对象后,将调用其prepare()方法

我需要用粗体字写这个角色的帮助。我有这个:

class Fruit():
    
    def __init__(self):
        print(f"Fruit.__init__")
            
    def price(self):
        return 0
        
    def prepare(self):
        print(f"Preparing {fruit}")
        
    @staticmethod
    def order_fruit(fruit_type):
        fruit= str(fruit_type.lower().strip())
        prepare(fruit)
        #I can't figure out how to get it to call, for example, Orange.prepare()

我可能误解了说明。

这里有一种方法,使用字典将所有派生类的名称映射到相应的子类本身

class Fruit():
    def __init__(self):
        print(f"Fruit.__init__()")

    def price(self):
        return 0

    def prepare(self):
        print(f"Preparing {type(self).__name__}")

    @staticmethod
    def order_fruit(fruit_type):

        # Dictionary of all derived classes.
        derived_classes = {'Apple': Apple, 'Orange': Orange}

        fruit = str(fruit_type.lower().strip())
        for classname, FruitSubclass in derived_classes.items():
            if classname.lower() == fruit:
                fruit = FruitSubclass()
                fruit.prepare()
                break
        else:
            raise RuntimeError(f'Unknown fruit type {fruit_type!r}')


class Orange(Fruit):
    def __init__(self):
        print(f"Orange.__init__()")


class Apple(Fruit):
    def __init__(self):
        print(f"Apple.__init__()")


if __name__ == '__main__':

    fruit = Fruit.order_fruit('orange')

这种方法的一个潜在问题是每次添加新的子类时都需要手动更新基类。
还有其他更先进的方法来做同样的事情。查看我的答案。

这个问题不属于StackOverflow,因为它只针对您自己的问题,对任何未来的读者都没有帮助。也就是说,粗体是直截了当的:工厂获取一个字符串,然后通过一些if语句运行它。如果字符串是
fruit\u type
,那么它会删掉其中的空格,并将其转换为小写的
fruit\u type=fruit\u type.trim().lower()
,然后说
如果fruit\u type==“orange”:例如return orange()
。在我看来,@Kraigolas关于你不属于这里的问题的说法是错误的,所以你可以忽略这一部分。欢迎你回答这个问题——事实上我确实回答了——但大多数用户对这类问题的回答都是否定的。如果你不能开始一个问题,你需要咨询你的笔记和教授,这个问题对未来的读者没有帮助,这是StackOverflow的主要目标。这是基于观点的,你是对的,但我想说的是,像这样的问题往往会被否决。@Kraigolas:你真的应该学会如何建立正确的链接。如果链接问题中有适用于此处的内容,您应该提及。无论如何,我仍然不同意你对这个问题的评估。克丽丝:这有助于/回答你的问题吗?@martinuea,有,谢谢。在再读了大约100遍说明书之后,我最终把它保持得非常简单:如果水果==橙色:水果=橙色()那么水果。准备()是的,我想那会更简单。让我感到惊讶的是,在这样一个非常初级的教程中,你被教导了。这也让我感到惊讶!:)这对我来说是一个非常具有挑战性的概念,因为我没有编程背景。我很高兴知道这一点,但我认为这是一个生存的时刻,我仍然不确定我是否真的理解它。再次感谢您的投入。