@Adolf45

Почему метод класса выводит None?

Продолжая изучать основы питона, столкнулся с некоторой проблемой
class schoolMember:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('(Создан schoolMember {0})'.format(self.name))
    
    def tell(self):
        print('Имя {0}, возраст {1},'.format(self.name, self.age), end=" ")
        return (self.name, self.age)
        
class Teacher(schoolMember):
    def __init__(self, name, age, salary):
        schoolMember.__init__(self, name, age)
        self.salary = salary
        print('Создан Teacher {0}'.format(self.name))
        
    def tell(self):
        schoolMember.tell(self)
        print('Зарплата: {0}'.format(self.salary))
        return 
        
class Students:
    def __init__(self, name, age, marks):
        schoolMember.__init__(self, name, age)
        self.marks = marks
        print('Создан {0}'.format(self.name))
        
    def tell(self):
        schoolMember.tell(self)
        print('Оценки {0}'.format(self.marks))
        
t = Teacher('Nina Petrovna', 50, 30000)
s = Students('Carl', 20, 80)

print()

members = [t,s]

for member in members:
    print(member.tell())


Если я правильно понимаю, то мы создали список members, чтобы с помощью цикла показать все имеющиеся объекты. Сама проблема заключается в том, что в выводе присутствует None. Я понимаю, что в методе отсутствует return, от этого и None вылезает, но если отдельно прописать для какого-нибудь объекта tell, но None нету( t.tell() к примеру ). Вполне можно просто прописать для каждого объекта tell и проблема решена, но это не совсем хорошо, ведь может объектов быть гораздо больше, тогда и прописывать для каждого будет неудобно, поэтому хочу разобраться, как это делать с помощью списка и цикла, но без None чтобы в конце-то концов. Надеюсь на понимание и помощь
  • Вопрос задан
  • 780 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
но если отдельно прописать для какого-нибудь объекта tell, но None нету( t.tell() к примеру )

Если я правильно понял, то вы о том, что если выполнить:
t = Teacher('Nina Petrovna', 50, 30000)
t.tell()

то None не будет выведен?

None появляется потому что вы вызываете печать, так что если напишите
t = Teacher('Nina Petrovna', 50, 30000)
print(t.tell())

то точно так же увидите None.

Я понимаю, что в методе отсутствует return, от этого и None вылезает

Все правильно, tell() возвращает None, вы этот None и выводите на экран. Вы явно запутались с print/return. Для вашей реализации вам не нужно делать print(obj.tell()), потому что нужные принты вы вызваете в самом методе.

Так что правильнее будет написать такой код:
for member in members:
    member.tell()


Оборачивать ваш метод в print() имеет смысл только тогда, когда вы не печатаете текст в самом методе, а только подготовливаете правильное предложение и возвращаете его через return.
def tell(self):
    return 'Имя {}, возраст {}'.format(self.name, self.age)


При вызове такого метода, вы не получите никакой вывод на экран:
s = Students('Carl', 20, 80)
s.tell()

Но зато вы можете сохранить результат работы в переменную и использовать ее потом, либо отправить сразу в print():
s = Students('Carl', 20, 80)
print(s.tell())
# либо
s = Students('Carl', 20, 80)
resutl = s.tell()
print(result)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы