📜  门| Sudo GATE 2021 测验 |第 31 题(1)

📅  最后修改于: 2023-12-03 14:58:34.317000             🧑  作者: Mango

门 | Sudo GATE 2021 测验 |第 31 题

简介

该题目要求实现一种门的模拟器,门具有两种可能的输入:开和关。该门可以被锁定,锁定时不能被打开或关闭。门可以是内部门,即只能从包含它的模块访问;也可以是外部门,即它可以从其他模块访问。

要求

实现一个门的类,要求包含以下方法:

  • is_external() : 返回该门是否为外部门。是则返回 True,否则返回 False
  • is_locked() : 返回该门是否被锁定。是则返回 True,否则返回 False
  • lock() : 锁定该门,之后所有对该门状态的修改操作都无效。
  • unlock() : 解锁该门,之后可以再次对该门状态进行修改。
  • open() : 尝试打开该门,如果门被锁定或已经开着,则返回 False,否则返回 True,表示门已经被打开。
  • close() : 尝试关闭该门,如果门被锁定或已经关着,则返回 False,否则返回 True,表示门已经被关闭。

实现一个门的模块,要求包含以下方法:

  • create_internal_door(initial_state: Optional[bool] = False) -> Door : 创建一个内部门,并返回该门的一个实例。如果 initial_stateTrue,则门是开着的;否则门是关着的。
  • create_external_door(initial_state: Optional[bool] = False) -> Door : 创建一个外部门,并返回该门的一个实例。如果 initial_stateTrue,则门是开着的;否则门是关着的。

门的状态变化要求:门在锁定后,只能保持在当前状态,不能再被打开或关闭;门在解锁后,可以随时被打开或关闭。

实现

以下是参考实现的代码片段。

from typing import Optional


class Door:
    def __init__(self, is_external: bool, initial_state: bool):
        self.is_external = is_external
        self.locked = False
        self.state = initial_state
    
    def is_external(self) -> bool:
        return self.is_external
    
    def is_locked(self) -> bool:
        return self.locked
    
    def lock(self) -> None:
        self.locked = True
    
    def unlock(self) -> None:
        self.locked = False
    
    def open(self) -> bool:
        if not self.locked and not self.state:
            self.state = True
            return True
        else:
            return False
    
    def close(self) -> bool:
        if not self.locked and self.state:
            self.state = False
            return True
        else:
            return False
    

def create_internal_door(initial_state: Optional[bool] = False) -> Door:
    return Door(False, initial_state)


def create_external_door(initial_state: Optional[bool] = False) -> Door:
    return Door(True, initial_state)
总结

这道题目要求实现一种门的模拟器,通过实现一个门的类和一个模块的方法来完成。门具有两种可能的输入:开和关。该门可以被锁定,锁定时不能被打开或关闭。门可以是内部门,即只能从包含它的模块访问;也可以是外部门,即它可以从其他模块访问。通过以上实现,我们可以完成这个功能,并满足门的状态变化的要求。