📜  门| GATE CS Mock 2018 |设置 2 |问题 27(1)

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

门 | GATE CS Mock 2018 |设置 2 |问题 27

本次 GATE CS Mock 考试的问题 27 是围绕着“门”展开的。该问题要求你实现一个门的抽象模型,该模型具有一个“请求进入”方法,以及一个“是否允许进入”的方法。以下是该问题的完整描述:

问题描述

假设有一个门的抽象模型,该模型具有一个“请求进入”方法,以及一个“是否允许进入”的方法。门有两种类型:普通门和 VIP 门。普通门只允许普通访客进入,而 VIP 门可以允许 VIP 访客进入。

对于普通门,请求进入后应直接允许进入。对于 VIP 门,根据门口的访客类型与门的类型决定是否允许进入。具体来说,如果门口的访客类型大于等于 VIP,则允许进入;否则禁止进入。

请你实现 Door 类,该类包含如下方法:

  • Door(bool is_vip_door) 初始化方法,比较简单,只需在构造函数中传入门的类型,即可创建一个 Door 对象。
  • void request_entry(Person p) 该方法接受一个 Person 对象作为参数,表示请求进入门。对于 VIP 门,应根据上述规定决定是否允许进入;对于普通门,直接允许进入。
  • bool enter_request_granted(Person p) 该方法接受一个 Person 对象作为参数,表示该访客请求是否允许进入门。

在本次模拟考试中,你需要完成 Door 类的实现,并通过样例测试来验证你的实现是否正确。

样例

对于以下代码:

d = Door(True)
p1, p2, p3 = Person(False), Person(True), Person(False)
d.request_entry(p1)
d.request_entry(p2)
d.request_entry(p3)
print(d.enter_request_granted(p1))
print(d.enter_request_granted(p2))
print(d.enter_request_granted(p3))

程序应该输出以下结果:

True
True
False
实现说明

Door 类可以采用以下实现:

class Door:
    def __init__(self, is_vip_door):
        self.is_vip_door = is_vip_door

    def request_entry(self, person):
        if self.is_vip_door and not person.is_vip:
            print("VIP requested, but non-VIP door.")
            return False
        return True

    def enter_request_granted(self, person):
        return self.request_entry(person)

上述代码实现了 Door 类,其中 request_entry() 方法实现了门的进入请求方法,enter_request_granted() 方法实现了门的是否允许进入判断方法。具体来说,如果门是 VIP 门而访客不是 VIP,则禁止进入;否则允许进入。

如果你对这段代码中的语法和细节存在疑惑,可以参考以下解释:

  • Person 类可以按照下面的方式实现:

    class Person:
      def __init__(self, is_vip):
          self.is_vip = is_vip
    
  • 类中的 self 参数代表了类实例本身。你可以将其理解为 Java 中的 this,即表示当前对象。这是 Python 类语法中的一个特点,需要花功夫熟练掌握。

  • __init__() 方法是 Python 的构造方法,用于初始化对象。在本例中,Door 类的构造方法需要传递一个 is_vip_door 的参数,该参数表示门的类型(VIP 还是非 VIP)。

  • request_entry() 方法中的参数 person 是一个 Person 对象,表示访客信息。Door 类需要根据门的类型与访客类型来判断是否允许进入。如果门口的访客类型不符合门的类型要求,则禁止进入,否则允许进入。

  • enter_request_granted() 方法的实现很简单,调用 request_entry() 方法即可。这种写法的好处是代码简洁,易读。