首页 > 其他分享 >chatGPT生成的简单工厂模式代码教学

chatGPT生成的简单工厂模式代码教学

时间:2023-04-25 15:25:31浏览次数:37  
标签:__ num1 num2 代码 教学 result chatGPT self Operation

"""
在这个示例代码中,我们使用了简单工厂模式来创建不同的运算对象。首先,我们定义了一个 Operation 类作为运算类的基类,其中包含两个操作数 num1 和 num2,
以及一个 get_result 方法用于获取运算结果。

接下来,我们定义了四个具体的运算子类 Add、Subtract、Multiply 和 Divide,分别实现了加法、减法、乘法和除法的计算方法。这些子类都继承自 Operation
基类,并重载了 get_result 方法实现自己的运算逻辑。

最后,我们使用一个简单工厂类 OperationFactory 来创建不同的运算对象。这个工厂类包含一个静态方法 create_operation,根据传入的参数来判断应该创建
哪种类型的运算对象,并返回相应的对象实例。

在 main 函数中,我们首先读取两个输入数值和一个运算符号,然后调用 OperationFactory 类的 create_operation 方法来创建对应的运算对象。最后,我们
调用该对象的 get_result 方法获取运算结果,并将结果输出到屏幕上。

使用简单工厂模式封装可以使代码结构更加清晰,便于后期的扩展和维护。如果需要添加其他的运算方法,只需要创建相应的子类,并在工厂类中添加对应的判断逻辑即可。
UML类图
+---------------+                               +------------------+
|   Operation   |                               |  OperationFactory|
+---------------+                               +------------------+
|  - num1: float |                               +------------------+
|  - num2: float |                               | + create_operation(num1: float, num2: float, operator: str): Operation |
+---------------+                               +------------------+
| + get_result():|                                            |
+---------------+                                            |
             ^                                              |
             |                                              |
         +-------+                                     +-----------+
         | Add   |                                     |  Subtract |
         +-------+                                     +-----------+
         |       |                                     |           |
         +-------+                                     +-----------+
              ^                                               ^
              |                                               |
         +-------+                                     +-----------+
         |Multiply|                                     |  Divide   |
         +-------+                                     +-----------+

在上面的UML类图中,我们可以看到类之间的关系。其中 Operation 类作为运算基类,包含了两个操作数 num1 和 num2,以及一个抽象方法 get_result。它作
为其他子类的父类,并提供了一个统一的接口。

Add、Subtract、Multiply 和 Divide 类分别实现了加法、减法、乘法和除法,它们继承了 Operation 基类,并实现了自己的 get_result 方法。在这些子
类中,我们可以看到它们所继承的属性和方法。

最后,OperationFactory 是一个简单工厂类,用于创建不同的运算对象。它提供了一个静态方法 create_operation,根据传入的参数来判断应该创建哪种类型的
运算对象,并返回相应的对象实例。

通过这个UML类图,我们可以更清晰地了解这个程序的结构和类之间的关系,方便进行后续的扩展和维护。

"""


class Operation:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def get_result(self):
        pass


class Add(Operation):
    def get_result(self):
        return self.num1 + self.num2


"""
在这个程序中,Add 是一个类,它继承自父类 Operation。继承后,Add 类拥有了父类的属性和方法,并且可以在此基础上添加自己独有的属性和方法。

Add 类中并没有定义参数,但是它会继承父类 Operation 的构造函数,即 __init__ 方法。所以当创建一个 Add 对象时,需要传入两个参数 num1 和 num2,
以供初始化父类属性。这两个参数会被传递给 Operation 父类的 __init__ 方法,完成对象的初始化。

get_result 方法是用来计算数学运算结果的方法,在 Add 类中其具体实现为将两个数相加并返回结果。由于 Add 类继承自 Operation 父类,因此实例化一个 
Add 对象并调用 get_result 方法,就可以得到计算出来的结果了。
"""


class Subtract(Operation):
    def get_result(self):
        return self.num1 - self.num2


class Multiply(Operation):
    def get_result(self):
        return self.num1 * self.num2


class Divide(Operation):
    def get_result(self):
        if self.num2 == 0:
            raise ZeroDivisionError("除数不能为0")
        return self.num1 / self.num2


"""
Python 中常见的 raise 异常类型包括但不限于以下几种:

- AttributeError:     当访问一个对象属性或方法不存在时抛出;
- ValueError:         当传递给函数的参数不合法时抛出;
- TypeError:          当传递给函数的参数类型不正确时抛出;
- NameError:          当访问一个未定义的变量时抛出;
- KeyError:           当使用字典中不存在的键时抛出;
- IndexError:         当使用列表中不存在的索引时抛出;
- ZeroDivisionError:  当用 0 作为除数时抛出;
- FileNotFoundError:  当文件不存在时抛出;
- OSError:            当系统操作产生错误时抛出。

需要注意的是,在 Python 中,程序员可以自定义异常类型,并通过 raise 语句手动抛出。通过自定义异常类型,可以更准确地描述错误信息,以便程序能够更好地处
理和调试问题。
"""


class OperationFactory:
    @staticmethod
    def create_operation(num1, num2, operator):
        if operator == '+':
            return Add(num1, num2)
        elif operator == '-':
            return Subtract(num1, num2)
        elif operator == '*':
            return Multiply(num1, num2)
        elif operator == '/':
            return Divide(num1, num2)


"""
@staticmethod 是 Python 语言中的一个装饰器,用于将方法定义为静态方法。在定义静态方法时需要使用该装饰器来修饰。

静态方法是指与类的实例无关的方法,在调用时不会隐式地传入实例参数 self,而是可以直接使用类名进行调用。同时,由于静态方法不需要访问实例属性和方法,因此
它们通常用于进行一些类相关但是又不需要使用实例属性和方法的操作,比如工厂模式中的对象创建方法或者是工具类函数等。

在本程序中,create_operation 方法是一个静态方法,用于根据传入的参数创建不同类型的运算对象。由于这个方法只涉及到类级别的操作,并不需要使用实例变量,
因此将其定义为静态方法可以使得代码更加简洁,便于使用类名进行调用。
"""


def main():
    num1 = float(input("请输入第一个数:"))
    num2 = float(input("请输入第二个数:"))
    operator = input("请输入运算符号:")

    operation = OperationFactory.create_operation(num1, num2, operator)
    result = operation.get_result()

    print("计算结果为:", result)


if __name__ == '__main__':
    main()

"""
这个 __name__ 属性是 Python 自带的一个内置属性,用来表示当前模块的名称。当一个 Python 文件被直接运行时,这个属性的值就是 '__main__'。所以在脚
本文件中,可以通过判断 __name__ 的值是否为 '__main__' 来区分模块是被导入还是直接运行。

具体来说,如果我们在一个单独的 Python 文件中定义了一些函数或类,并把它们放在了 if __name__ == '__main__': 语句块中,那么当我们运行这个 Python 
文件时,这些函数和类只会在这个文件作为主程序被运行时才执行。而如果我们把这个文件作为一个模块导入到其他 Python 文件中,这些函数和类就不会被执行。
"""

 

标签:__,num1,num2,代码,教学,result,chatGPT,self,Operation
From: https://www.cnblogs.com/nicere/p/17352686.html

相关文章

  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • token认证过滤器代码实现与配置认证过滤器
    token认证过滤器代码实现认证过滤器​我们需要自定义一个过滤器,这个过滤器会去获取请求头中的token,对token进行解析取出其中的userid。​使用userid去redis中获取对应的LoginUser对象。​然后封装Authentication对象存入SecurityContextHolder......
  • 搜狗细胞词库处理代码(可用于scel转txt)
    今天先贴个简单代码,稍后再详细叙述…… 基于QT实现,主要是考虑Unicode字符处理的方便,可以稍加处理用于C或C++语言。 //取连续两字节,转换为short类型的值,字节顺序是低字节-高字节inlineunsignedshortGetUShort(QByteArray&fData,intstartPos){unsignedcharlow=fData......
  • P.10-准备工作、P.11-数据库校验用户准备工作、P.12-数据库验证用户核心代码实现
    P.10-准备工作1.添加依赖<!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>......
  • jenkins流水线发布前端代码
    pipeline{agent{label'hw'}environment{VERSION=sh(script:"echo`date'+%Y%m%d%H%M%S'`",returnStdout:true).trim()}stages{stage('克隆代码'){steps{......
  • C代码之GPIO
    ***@fnintgpio_is_exported(size_tgpio)*@briefTestgpioisexportedornot*@paramsize_tgpio:Thenumberofgpio*@param*@returnIsexported:(0);Isnotexported:(-1)*/intgpio_is_exported(size_tgpio){ intfd=0; charbuf[64]......
  • 登录接口实现细节分析与登录接口代码实现
    登录接口实现细节分析登陆接口接下我们需要自定义登陆接口,然后让SpringSecurity对这个接口放行,让用户访问这个接口的时候不用登录也能访问。​在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证,所以需要在SecurityConfig中配置把Authe......
  • 淘宝API接口对接(商品详情,评论,按图搜图,订单列表)代码封装,可高并发
    淘宝OpenAPI(Openapplicationprogramminginterface)是一套REST方式的开放应用程序编程接口。淘宝网根据自己提供的电子商务基础服务,抽象并做成一系列的API接口。通过这些接口,可以让外部用户能够通过程序的方式访问淘宝网的数据和平台。淘宝OpenAPI是淘宝开放平台的重要组成......
  • 浏览器4行js代码自动读取IC卡号
    BS架构软件集成IC卡读卡器,在前段只需要4行js代码即可实现自动读取IC卡卡号,在web上使用IC卡读卡器其实就是这么简单.首先安装友我IC卡读卡器web插件,这个web插件安装后之后goole浏览器,火狐,IE等浏览器,然后插上IC卡读卡器YW-607HC,然后开始敲js代码了.引入相应的js后,开始寻卡......
  • 代码重构
    ......