Пример из книги "Byte of Python" не работает, помогите понять почему (
(Вопрос решен, проблема была в отступах)
Вообщем есть код из главы 14.7 Метаклассы, стр 118
Я его переписал и несколько раз проверил (возможно все-таки ошибся))
Как я понял этот код создает класс и два его подкласса, причем запрещается
создавать экземпляры родительского класса, по идее все должно работать.
Python ругается что класс SchoolMember() не имеет метода .tell()
Это не первая ошибка которую я встречал.
Был еще пример копирования строки с помощью полной вырезки,
может раньше так можно было делать, а вот сейчас так не получится.
Может тут тоже ошибка связанная с новой версией Python
Моя версия - 3.9.4
Версия в книге - 3.3.0
Вот сам код:
from abc import *
class SchoolMember(metaclass=ABCMeta):
~def __init__(self,name,age):
~~self.name = name
~~self.age = age
~~print('(Создан SchoolMember: {0})'.format(self.name))
~@abstractmethod
~def tell(self):
~~print('Имя:" {0}" Возраст:"'.format(self.name, self.age), end = ' ')
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:d}"'.format(self.salary))
class Student(SchoolMember):
~def __init__(self, name, age, marks):
~~SchoolMember.__init__(self, name, age)
~~self.marks = marks
~~print('(Создан Student: {0}'.format(self.name))
~def tell(self):
~~SchoolMember.tell(self)
~~print('Оценки: "{0:d}"'.format(self.marks))
t = Teacher('Mrs.Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
# создание объекта класса SchoolMember приведет к ошибке
print()
members = [t,s]
for member in members:
~member.tell()
В онлайн интерпретаторах выполняется
https://ideone.com/lopPGG
https://www.programiz.com/python-programming/online-compiler/
----------------
stdout
(Создан SchoolMember: Mrs.Shrividya)
(Создан Teacher: Mrs.Shrividya
(Создан SchoolMember: Swaroop)
(Создан Student: Swaroop
Имя:" Mrs.Shrividya" Возраст:" Зарплата: "30000"
Имя:" Swaroop" Возраст:" Оценки: "75"
-----------------
Какие там версии х. з, но из-за разницы 3.9.4, 3.3.0 не должно. Потому, что сообщение об ошибке относится к самому классу, а не к каким-то отличиям в синтаксисе.