📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 27(1)

📅  最后修改于: 2023-12-03 15:42:20.133000             🧑  作者: Mango

题目27-门

本题为Sudo GATE 2020 Mock III(2019 年 1 月 24 日)第27题,题目要求我们基于给出的门类结构体实现门的开关机制。

问题描述

门类有三个属性:

  • 状态(state): 0代表门关着;1代表门开着。
  • 名称(name): 门的名称,类型为字符串。
  • 操作日志(logs):保存门的操作记录,类型为列表。

门类有两个方法:

  1. open()方法:将门开启并将状态设置为1。在logs中添加"门name开了"操作。
  2. close()方法:将门关闭并将状态设置为0。在logs中添加"门name关了"操作。

我们需要实现两个子类来扩展门类。

DoorWithPassword类

该类继承自门类,增加了一个密码并且需要通过密码才能开门。在门状态改变前将要求输入密码,如果输入密码错误则不改变门状态。密码默认为"password"。

该类还增加了一个方法:

  1. change_password(new_password)方法:将密码设置为新密码。
AutomaticDoor类

该类继承自门类,增加了一个属性,表示门的自动开启和关闭状态。如果状态为1则代表门处于自动开启状态;如果状态为2则代表门处于自动关闭状态。开启和关闭状态默认为0。

该类有两个方法:

  1. set_auto_open()方法:将门的自动开启状态设置为1,并且打印门开启成功的信息。
  2. set_auto_close()方法:将门的自动关闭状态设置为2,并且打印门关闭成功的信息。
代码实现

任务要求我们基于给出的门类结构体实现门的开关机制。我们将分两步进行操作。首先,我们利用OOP的继承机制,分别制定"DoorWithPassword"和"AutomaticDoor"两个子类,以扩展门类。代码如下:

class Door:
    def __init__(self, name):
        self.name = name
        self.state = 0
        self.logs = []

    def open(self):
        self.state = 1
        self.logs.append("门" + self.name + "开了")

    def close(self):
        self.state = 0
        self.logs.append("门" + self.name + "关了")

class DoorWithPassword(Door):
    def __init__(self, name, password="password"):
        super().__init__(name)
        self.password = password

    def open(self):
        if self.password == input("请输入密码:"):
            super().open()

    def change_password(self, new_password):
        self.password = new_password

class AutomaticDoor(Door):
    def __init__(self, name):
        super().__init__(name)
        self.auto_state = 0

    def set_auto_open(self):
        self.auto_state = 1
        print("门" + self.name + "已开启自动开启功能")

    def set_auto_close(self):
        self.auto_state = 2
        print("门" + self.name + "已开启自动关闭功能")

在代码实现的第二步,我们调用Door类以及它的子类,使用open()和close()方法,完成门的开关操作。同时,我们还可以调用change_password()、set_auto_open()和set_auto_close()方法,来完成门密码的重设和门自动开启关闭操作。

至此,我们完成了基于给出的门类结构体实现门的开关机制的任务。

总结
  • 在OOP中,可以通过继承来扩展一个类。子类继承父类的所有属性和方法,并且可以自己增加新的属性和方法。
  • 类中的__init__方法,定义了类的属性和初始值。
  • 类的方法是通过def来定义的,其中第一个参数是self,代表类的实例对象。
  • init、open()、close()、change_password()、set_auto_open()和set_auto_close()方法,是本题要求实现的方法。
  • super()用于调用父类的方法。super()的语法是super().父类方法()。
  • 代码中的if语句用于校验密码。当用户输入的密码和门的密码一致时,门才会开启。
  • 在代码实现中,我们还可以调用logs属性,来获取门的操作记录。