Может ли метод, работающий с массивом объекта класса, использовать методы массива? - PullRequest
0 голосов
/ 14 января 2020

Я новичок здесь, и новый в Python. У меня был некоторый C / C ++ в коллеге. Я делаю курс от Удеми, и мне интересно, если есть какая-то лучшая идея вопроса о нахождении элемента массива объектов класса на основе одного значения. Задачей курса было найти «самого старого кота». Решение - использовать списки / массивы, но я хочу знать, как работать с массивами объектов, и если есть лучший вариант, чем мой метод stati c getoldest, потому что мне кажется, что я пытаюсь "обмануть" python.

    class Cat:

    def getoldest(Cat=[]):
        age_table=[]
        for one in Cat:
            age_table.append(one.age)         
        return Cat[age_table.index(max(age_table))]

    def __init__(self, name, age):
        self.name = name
        self.age = age


# 1 Instantiate the Cat object with few cats
kotki3=[]
kotki3.append(Cat("zimka", 5))
kotki3.append(Cat("korek", 9))
kotki3.append(Cat("oczko", 10))
kotki3.append(Cat("kotek", 1))
kotki3.append(Cat("edward", 4))

# 2 Create a function that finds the oldest cat

oldest = Cat.getoldest(kotki3)

# 3 Print out: "The oldest cat is x years old.". x will be the oldest cat age by using the function in #2

print(f'The oldest cat is {oldest.name} and it\'s {oldest.age} years old')

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Вы можете использовать @classmethod, таким образом, функция будет иметь статус c и получит класс в качестве первого аргумента по умолчанию, а также переменная _Instances, сделанная здесь c.

Когда новый Создается экземпляр Cat, он будет добавлен в список _Instances.

class Cat:
    _Instances=[]

    @classmethod
    def getoldest(cls):
        _Instance = max(cls._Instances,key=lambda Instance: Instance.age)
        return ("Oldest {} is {}, and {} years old.".format(cls.__name__,_Instance.name,_Instance.age))

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__class__._Instances.append(self)

Cat("a",1)
Cat("b",2)
Cat("c",3)
Cat("d",4)
print(Cat.getoldest())
0 голосов
/ 14 января 2020

Я думаю, что этот пример может помочь вам увидеть лучший способ сделать это

class Cat:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_details(self):
        return self.name, self.age


cats = [Cat("zimka", 5),
         Cat("oczko", 10),
         Cat("kotek", 1),
         Cat("edward", 4) ]

results = []
for cat in cats:
    (name, age) = cat.get_details()
    results.append((name,age))
print(sorted(results, key = lambda x: -x[1]))

...