简体   繁体   中英

Combination Lock Program

Me and my partner have been working on this for a few hours and can't figure this out. The directions are vague in some areas and our professor did not do a good job of breaking it down to help us. Here is a link to the directions. I believe they are not very clear but please correct me if I am wrong and just overthinking it https://imgur.com/a/huHnwos

I believe that our biggest problems are the unlock(combination) and set_new_combination(new_combination) methods. I can figure out the str () method as that one isn't very hard to do. We've tried the things our professor has told us to try but they have been unsuccessful.

class Lock:
    def __init__(self, combination = 0):
        self.combination = combination
        self.locked = False

    def lock(self):
        self.locked = True

    def unlock(self, combination):
        if combination == True or combination == 0:
             self.locked = False

    def set_new_combination(self, new_combination):
        if self.locked == False:
            self.combination = new_combination

   def is_locked(self):
        if self.locked == True or self.combination == True:
            return True
        else:
            return False

    def __eq__(self, other):
        if other is not None and type(other) == type(self):
            if self.combination == other.new_combination:
                return False

    def __str__(self):
        return self.combination, ',', self.locked

The expected result should be a working basic combination lock.

Your unlock method is trying to compare a boolean to a number (the combination). Change it to look like this:

def unlock(self, combination):
    if combination == self.combination:
         self.locked = False

You also did this in your is_locked method, so that should be changed too:

def is_locked(self):
    return self.locked

(Any time you find yourself writing something along the lines of if x return True else return False you can almost always replace this with return x if the conditional is simple).

set_new_combination works fine; I don't know what issue you saw with it.

Finally, your __str__ method should actually return a string:

def __str__(self):
    return '[' + str(self.combination) + ', ' + 'locked' if self.locked else 'unlocked' + ']'

There are couple of problems with your code. First, if statement in your unlock method will be executed only if combination == 0 or combination == 1 , which has nothing to do with lock's combination ( self.combination ). In your is_locked method you should only return self.locked , no need for if . __eq__ method can also be simplified. And __str__ method should actually return String.

class Lock:
    def __init__(self, combination = 0):
        self.combination = combination
        self.locked = False

    def lock(self):
        self.locked = True

    def unlock(self, combination):
        if self.combination == combination:
             self.locked = False

    def set_new_combination(self, new_combination):
        if not self.locked:
            self.combination = new_combination

    def is_locked(self):
        return self.locked

    def __eq__(self, other):
        return isinstance(other, Lock) and self.combination == other.combination

    def __str__(self):
        return f'{self.combination}, { "locked" if self.locked else "unlocked"}'

Here's my implementation based on the inctructions provided, with comments where it deviates from your code.

class Lock:
    def __init__(self, combination = 0):  # No change here
        self.combination = combination
        self.locked = False

    def lock(self):
        # Although a test of self.locked is redundant, the instructions state
        # "...if invoked a second time this, method should do nothing."
        if not self.locked:
            self.locked = True

    def unlock(self, combination):
        # You were not testing the stored combination against the one passed to the method.
        # it does not matter if the stored combination is zero or a different number,
        # you still need to check for equality.
        # You also need a test as with lock() to satisfy the "if invoked a second time this, 
        # method should do nothing" requirement.
        if self.locked and self.combination == combination:
            self.locked = False

    def set_new_combination(self, new_combination):
        # You can simply the `if` condition, there's no need to test against False
        if not self.locked:
            self.combination = new_combination

    def is_locked(self):
        # I don't know why you are testing the self.combination value, you 
        # only need to return the state of the lock   
        return self.locked

    def __eq__(self, other):
        # You have the correct guard conditions but were returning False when 
        # the combinations matched. You can simply return the comparison result.
        if other is not None and type(other) == type(self):
            return self.combination == other.new_combination

    def __str__(self):
        # For some reason the output format specified for this appears to put it in a list
        # (the square brackets) but as it's only for display we'll "fake" the list.
        # The `if` statement prints the word 'locked' or 'unlocked' depending on the 
        # `self.locked` state.
        return '[{}, {}]'.format(self.combination, 'locked' if self.locked else 'unlocked')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM