TokyoToo
TokyoToo

Reputation: 926

How to return the class instance in a function in Python

I had a class challenge this week and although I returned the correct age I did not return the class instance as per instructions. I've read this post but the python 2.7 syntax seems completely different.

Instructor's notes.

The class is implemented correctly, and you create its instances correctly. But when you try to find the oldest dog, you return only its age, not the actual instance (as per instructions). The instance holds the information not only on the age, but also on the name. A minor comment: you call the function "oldest_dog" from inside the formatted string - this is unconventional, you'd better execute the function on the line before that and include only the calculated variable inside the formatted string.

class Dog:

    # constructor method
    def __init__(self, name, age):
        self.name = name
        self.age = age

# three class instance declarations
maxx = Dog("Maxx", 2)
rex = Dog("Rex", 10)
tito = Dog("Tito", 5)

# return max age instance
def oldest_dog(dog_list):
    return max(dog_list)

# input
dog_ages = {maxx.age, rex.age, tito.age}

# I changed this as per instructor's notes.
age = oldest_dog(dog_ages)
print(f"The oldest dog is {age} years old.")

Upvotes: 1

Views: 5366

Answers (1)

Code Pope
Code Pope

Reputation: 5449

I have changed your code to show how you can return instances:

class Dog:

    # constructor method
    def __init__(self, name, age):
        self.name = name
        self.age = age

# three class instance declarations
maxx = Dog("Maxx", 2)
rex = Dog("Rex", 10)
tito = Dog("Tito", 5)

# return the dog with the max age
def oldest_dog(dog_list):
    return max(dog_list,  key=lambda x: x.age)  # use lambda expression to access the property age of the objects

# input
dogs = [maxx, rex, tito]

# I changed this as per instructor's notes.
dog = oldest_dog(dogs)     # gets the dog instance with max age
print(f"The oldest dog is {dog.age} years old.")

Output:

The oldest dog is 10 years old.

EDIT: If you are not allowed to use lambda, then you have to iterate through the objects. Here an implementation without lambda of the function oldest_dog(dog_list):

# return max age instance
def oldest_dog(dog_list):
    max_dog = Dog('',-1)
    for dog in dog_list:
        if dog.age > max_dog.age:
            max_dog = dog

EDIT 2: As @HampusLarsson stated you can also define a function which returns the property age and use it to prevent using lambdas. Here a version:

def get_dog_age(dog):
    return dog.age

# return max age instance
def oldest_dog(dog_list):
    return max(dog_list,  key= get_dog_age)

Upvotes: 3

Related Questions