【问题标题】:Creating a factory class创建工厂类
【发布时间】:2021-02-26 22:08:56
【问题描述】:

作业包含以下说明:

第二部分 – 工厂类
此类充当其他具体 Fruitclasses 的基类,例如 Orange 和 Apple。正如标题所暗示的,这个类也将作为这些派生类的工厂。这 类应具有以下方法:
• __init__(self)
o 此方法主要是占位符。在调试时调用它时打印一条消息。
• 价格(自己)
o 返回商品的价格。
o 这也是派生类使用的占位符。它只需要返回 0。
• 准备(自己)
o 此方法是派生类使用的占位符。
o 在派生类中,此方法充当封装复杂过程的外观
用于准备水果。
**• order_fruit(fruit_type) # 注意没有'self'
o 此方法充当制作水果对象的工厂方法。
o 这个方法应该是静态的,所以用@staticmethod 装饰器标记它。
o 开工流程如下:
▪ 确保fruit_type 是一个字符串并修剪并将其转换为小写
▪ 创建字符串所要求类型的对象
• 所以如果它是“橙色”:
o 水果 = Orange()
▪ 创建水果对象后,您将调用它的 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()

我可能误解了说明。

【问题讨论】:

  • 这个问题不属于 StackOverflow,因为它是针对您自己的问题,不会帮助任何未来的读者。话虽如此,粗体是直截了当的:工厂接受一个字符串,然后通过一些 if 语句运行它。如果字符串是fruit_type,那么它会删除它的空白并将其转换为小写fruit_type= fruit_type.trim().lower(),然后说if fruit_type == "orange": return Orange()
  • @Kraigolas 关于你的问题不属于这里的说法是不正确的 IMO,所以你可以忽略它的那部分。
  • @martineau 请参阅meta.stackoverflow.com/questions/334822/…。欢迎您回答这个问题——事实上我确实回答了这个问题——但大多数用户对这类问题的反应是消极的。如果你不能开始一个问题,你应该咨询你的笔记和教授,这个问题对未来的读者没有帮助,这是 StackOverflow 的主要目标。您是正确的,这是基于意见的,但我的意思是这样的问题往往会被否决。
  • @Kraigolas:你真的应该学习如何建立正确的链接。如果链接问题中有适用于此处的内容,您应该提及它。无论如何,我仍然不同意你对这个问题的评价。

标签: python class factory


【解决方案1】:

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

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')

这种方法的一个潜在问题是每次添加新的子类时都需要手动更新基类。 还有其他更高级的方法可以做同样的事情。请参阅我对Improper use of __new__ to generate classes? 的回复。

【讨论】:

  • Chrissy:这有助于/回答你的问题吗?
  • @martinuea,确实如此,谢谢。在重新阅读了大约 100 次以上的说明后,我最终只是保持它非常简单: if fruit == orange: fruit= Orange() then fruit.prepare()
  • 是的,我想那会更简单。令我惊讶的是,在这样一个非常基础的教程中,你正在学习factory classes
  • 这也让我感到惊讶! :) 这对我来说是一个非常具有挑战性的概念,因为我没有编程背景。我很高兴了解到它,但我认为这是一个生存的时刻,我仍然不确定我是否真的理解它。再次感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多