March 5

Наследование. Полиморфизм

class Mammal:
	className = 'Mammal'


class Dog(Mammal):
	species = 'Dog'
	className = 'DogMammal'


class Cat(Mammal):
	species = 'Cat'


dog = Dog()
cat = Cat()

print(dog.className, cat.className, sep = '\n')
# Реализуйте два дочерних класса Cat и Dog для класса Animal.
# Добавьте дополнительные методы и атрибуты, специфичные для каждого подкласса

class Animal:
	def __init__(self, name: str, age: int) -> None:
		self.name = name
		self.age = age

	def speak(self) -> 'Animal':
		print('Animal speaks')
		return self

	def print_info(self) -> 'Animal':
		print('\n'.join([
			f'Экземпляр {self} класса {self.__class__.__name__}',
			f'  Имя: {self.name}',
			f'  Возраст: {self.age}'
		]), end = '\n\n')

		return self

	def move(self) -> 'Animal':
		print(f'{self.__class__.__name__} moves')
		return self


class Dog(Animal):
	def __init__(self, name: str, age: int) -> None:
		super().__init__(name, age)

	def speak(self) -> None:
		print('Hawk')

	def print_info(self) -> 'Animal':
		print('\n'.join([
			f'Собака',
			f'  Имя: {self.name}',
			f'  Возраст: {self.age}'
		]), end = '\n\n')

		return self


class Cat(Animal):
	def __init__(self, name: str, age: int) -> None:
		super().__init__(name, age)

	def speak(self) -> None:
		print('Meow')

	def print_info(self) -> 'Animal':
		print('\n'.join([
			f'Кошка',
			f'  Имя: {self.name}',
			f'  Возраст: {self.age}'
		]), end = '\n\n')

		return self

	def purr(self) -> 'Animal':
		print('Cat purrs')
		return self


class Bunny(Animal):
	def __init__(self, name: str, age: int) -> None:
		super().__init__(name, age)

	def speak(self) -> 'Animal':
		print('*The bunny squeals*')
		return self

	def print_info(self) -> 'Animal':
		print('\n'.join([
			f'Заяц',
			f'  Имя: {self.name}',
			f'  Возраст: {self.age}'
		]), end = '\n\n')

		return self

	def move(self) -> 'Animal':
		print(f'Bunny jumps')
		return self


def main():
	animal = Animal('Боб', 3)
	dog = Dog('Собака-бабака', 6)
	cat = Cat('Хрюша', 4)
	bunny = Bunny('Снежок', 2)

	for animal in [animal, dog, cat, bunny]:
		animal.print_info()

	for animal in [animal, dog, cat, bunny]:
		animal.move()

	cat.purr()


if __name__ == '__main__':
	main()