Как использовать метод в классе для сравнения двух объектов класса - PullRequest
1 голос
/ 21 апреля 2019

Привет, ребята. Я совершенно новый в oop in python. Я пытаюсь написать класс учеников, который определяет количество учеников, их возраст, рост и вес и сохраняет эту информацию в виде 3 отдельных списков.

Я стремлюсь вычислить среднее значение возраста и веса, а также высоты. У меня пока нет проблем.

На следующем шаге я хочу сравнить средний возраст двух экземпляров класса плюс среднее значение весов.

Поскольку это упражнение в уп, я должен выполнить его методом класса. Но я не знаю, возможно ли это сделать с помощью метода в исходном классе (классе School), или я должен создать подкласс для сравнения атрибутов двух экземпляров класса School.

Любая помощь очень ценится.

Вот мой код:

class School:

    avg_age = 0
    avg_heigt = 0
    avg_weight = 0

    def __init__(self):

        self.n =int(input())

        self.list_ages = [float(x) for x in input().split(" ")]

        self.list_higt = [float(x) for x in input().split(" ")]

        self.list_weight = [float(x) for x in input().split(" ")]      

    def get_av(self):
        School.avg_age = sum(self.list_ages) / len(self.list_ages)

        School.avg_heigt = sum(self.list_higt)/len(self.list_higt)

        Scoohl.avg_weight = sum(self.list_weight)/len(self.list_weight)
        return("{},{},{}".format(School.avg_age,School.avg_heigt,School.avg_weight))  

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Вы можете сделать это, создав функцию экземпляра с еще одним параметром или используя стиль статического метода с staticmethod decorator

class School:
    # your code

    def compare_to(self, other)
    # compare an instancte with other instance
    # your compare code here
        pass

    @staticmethod
    def compare(first_school, second_school):
    # first and second school are two objects of class school
    # your compare code
        pass

И вы можете вызвать свою функцию в двух стилях

s1 = School()
s2 = School()
# Your init data
s1.compare_to(s2)
School.compare(s1, s2)

Редактировать: Как ответ @Patrick, вы должны объявить свои переменные как переменные экземпляра, чтобы заставить их хранить по-разному для экземпляра

0 голосов
/ 21 апреля 2019

Вы смешиваете атрибуты класса и атрибуты экземпляра. Атрибуты класса общие между экземплярами:

class Banks:
    total = 0
    def __init__(self,name,money):
        self.name=name
        self.money=money
        Banks.total += money


b1 = Banks("one",100)
b2 = Banks("two",5000000)

# prints 5000100 - all the money of all banks, 
# does not help you comparing avgs ov instances at all
print(b1.total)  

Выход:

5000100

Вам нужны отдельные средние значения для каждого экземпляра и функция, которая сравнивает один экземпляр (self) и агенты other:

class School: 
    def __init__(self): 
        # self.n =int(input()) # not needed - use len(one of your lists) 
        list_ages = [float(x) for x in input("Gimme ages, space seperated: ").split()] 
        list_hight = [float(x) for x in input("Gimme hights, space seperated: ").split()] 
        list_weight = [float(x) for x in input("Gimme weights, space seperated: ").split()] 

        # shortest list downsizes all other lists 
        self.list_ages, self.list_hight, self.list_weight = zip(
            *zip( list_ages,list_hight,list_weight ))

    def get_av(self):
        self.avg_age = sum(self.list_ages) / len(self.list_ages)
        print(self.avg_age)
        self.avg_height = sum(self.list_hight) / len(self.list_hight)
        print(self.avg_height)
        self.avg_weight = sum(self.list_weight) / len(self.list_weight)
        print(self.avg_weight)  
        return  self.avg_age, self.avg_height, self.avg_weight

    def compare(self,other):
        self.get_av()
        other.get_av()
        print("Our pupils are younger: ", self.avg_age < other.avg_age)
        print("Our pupils are smaller: ", self.avg_height < other.avg_height)
        print("Our pupils are lighter: ", self.avg_weight < other.avg_weight)

c = School() # 4 5 6        22 44 66 88 99       20.2 20.2 20.2 20.2 20.2 20.2
d = School() # 100          100                  100

c.compare(d)

Вывод (отформатированный с новой строкой между ними):

Gimme ages, space seperated: 4 5 6
Gimme hights, space seperated: 22 44 66 88 99 
Gimme weights, space seperated:  20.2 20.2 20.2 20.2 20.2 20.2

Gimme ages, space seperated: 100
Gimme hights, space seperated: 100 
Gimme weights, space seperated: 100

5.0
44.0
20.2

100.0
100.0
100.0

Our pupils are younger:  True
Our pupils are smaller:  True
Our pupils are lighter:  True

Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...