Как вернуть экземпляр класса в функции в Python - PullRequest
0 голосов
/ 25 мая 2020

На этой неделе у меня был вызов класса, и хотя я вернул правильный возраст, я не вернул экземпляр класса в соответствии с инструкциями. Я прочитал этот пост , но синтаксис python 2.7 кажется совершенно другим.

Замечания для инструктора.

Класс реализован правильно, и вы правильно создаете его экземпляры. Но когда вы пытаетесь найти самую старую собаку, вы возвращаете только ее возраст, а не фактический экземпляр (согласно инструкциям). Экземпляр хранит информацию не только о возрасте, но и о имени. Небольшой комментарий: вы вызываете функцию «old_dog» из отформатированной строки - это нетрадиционно, вам лучше выполнить функцию в строке перед этим и включить только вычисленную переменную внутри отформатированной строки.

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.")

1 Ответ

3 голосов
/ 25 мая 2020

Я изменил ваш код, чтобы показать, как вы можете возвращать экземпляры:

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.")

Вывод:

The oldest dog is 10 years old.

EDIT: Если вам не разрешено используйте лямбда, тогда вам нужно перебирать объекты. Здесь реализация без лямбда функции 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: Как заявил @HampusLarsson, вы также можете определить функцию, которая возвращает свойство age, и использовать его чтобы предотвратить использование лямбда-выражений. Вот версия:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...