在Python中创建一个简单的锁和钥匙函数

问题描述 投票:0回答:3
class Lock:
 
   def __init__(self):
        self.key_code = "1234"  # Change this to your desired key code
        self.is_locked = True

    def lock(self):
        self.is_locked = True

    def unlock(self, entered_code):
        if entered_code == self.key_code:
            self.is_locked = False
        else:
            print("Incorrect key code. Lock remains locked.")

    def is_locked(self):
        return self.is_locked


def main():
    my_lock = Lock()

    print("The lock is currently locked.")
    while my_lock.is_locked():
        entered code = input("Enter the key code: ")
        my_lock.unlock(entered code)

    print("The lock is now unlocked.")


if __name__ == "__main__":
    main()

我写了这段代码,但它显示了一个

Type Error: 'bool' object is not callable
The lock is currently locked.

我一直在尝试创建一个锁定机制,但它显示类型错误。我尝试了很多方法还是没能解决。

python python-3.x error-handling locking
3个回答
0
投票

你就快到了:你的代码中有轻微错误 我。构造函数方法应该命名为init(带双下划线)而不是init。 二.您有一个名为 is_locked 的实例变量和一个名为 is_locked 的方法。这可能会导致冲突。我将该方法重命名为 is_locked_status 以避免冲突。 三.调用is_locked_status方法时,需要使用括号()来调用该方法并获取其返回值。

class Lock:
    def __init__(self):  # Use double underscores for the constructor method name
        self.key_code = "1234"
        self.is_locked = True

    def lock(self):
        self.is_locked = True

    def unlock(self, entered_code):
        if entered_code == self.key_code:
            self.is_locked = False
        else:
            print("Incorrect key code. Lock remains locked.")

    def is_locked_status(self):  # Rename the method to avoid name conflict
        return self.is_locked

def main():
    my_lock = Lock()

    print("The lock is currently locked.")
    while my_lock.is_locked_status():  # Call the renamed method
        entered_code = input("Enter the key code: ")
        my_lock.unlock(entered_code)
    print("The lock is now unlocked.")

if __name__ == "__main__":
    main()


0
投票

这里有两种方法。

class Lock:

    def __init__(self):
        self.key_code = "1234"  # Change this to your desired key code
        self.is_locked = True

    def lock(self):
        self.is_locked = True

    def unlock(self, entered_code):
        if entered_code == self.key_code:
            self.is_locked = False
        else:
            print("Incorrect key code. Lock remains locked.")

    def is_locked(self):
        return self.is_locked


def main():
    my_lock = Lock()

    print("The lock is currently locked.")
    while my_lock.is_locked:  # <-- Use variable here instead of getter
        entered_code = input("Enter the key code: ")
        my_lock.unlock(entered_code)

    print("The lock is now unlocked.")


if __name__ == "__main__":
    main()

这可行,但你想使用 getter 来访问你的变量。

class Lock:

    def __init__(self):
        self.key_code = "1234"  # Change this to your desired key code
        self.locked = True

    def lock(self):
        self.locked = True

    def unlock(self, entered_code):
        if entered_code == self.key_code:
            self.locked = False
        else:
            print("Incorrect key code. Lock remains locked.")

    def is_locked(self):
        return self.locked


def main():
    my_lock = Lock()

    print("The lock is currently locked.")
    while my_lock.is_locked():
        entered_code = input("Enter the key code: ")
        my_lock.unlock(entered_code)

    print("The lock is now unlocked.")


if __name__ == "__main__":
    main()

问题在于变量和方法具有相同的名称。提示就在错误中——它使用变量,认为它是一个方法,而不是使用同名的方法。将变量更改为

locked
使其起作用。


0
投票

首先,在提出问题时,您应该提供格式良好的代码,可以重现与您相同的结果。
为了回答您的问题,让我们看一下您收到的错误:

Traceback (most recent call last):
  File "C:/Users/myuser/Desktop/snippets/stackoverflow.py", line 27, in <module>
    main()
  File "C:/Users/myuser/Desktop/snippets/stackoverflow.py", line 21, in main
    while my_lock.is_locked():
TypeError: 'bool' object is not callable

错误指出第 21 行中的“bool”对象不可调用,即这一行:

while my_lock.is_locked():

Python中的“可调用”实体是一个可以被调用的实体,类似于函数,其中 is_locked 是一个布尔值,只能读取或变异为 True 或 False,以下是无效的:

True() False()
,所以简单将行更改为
while my_lock.is_locked:
可以解决您的问题。完整代码应如下所示:

class Lock:
    def __init__(self):
        self.key_code = "1234" # Change this to your desired key code
        self.is_locked = True

    def lock(self):
        self.is_locked = True

    def unlock(self, entered_code):
        if entered_code == self.key_code:
            self.is_locked = False
        else:
            print("Incorrect key code. Lock remains locked.")

    def is_locked(self):
        return self.is_locked
    
def main():
    my_lock = Lock()
    print("The lock is currently locked.")
    while my_lock.is_locked:
        entered_code = input("Enter the key code: ")
        my_lock.unlock(entered_code)
    print("The lock is now unlocked.")

if __name__ == "__main__":
    main()
© www.soinside.com 2019 - 2024. All rights reserved.