Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python реализация ошибки в дочерних классах

Галина Рыжова Ученик (148), на голосовании 2 недели назад
например, есть класс Class_mail - базовый класс с одним методом класса - method(). Данный метод должен наследоваться всеми дочерними классами и в рамках базового должен производить ошибку (если нет реализации в дочернем классе)
текст ошибки: “Метод method() должен быть определен в дочернем классе.”
Как реализовать производство данной ошибки, подскажите, пожалуйста!
Голосование за лучший ответ
Don Buho Ученик (170) 1 месяц назад
 from abc import ABC, abstractmethod 

class Animal(ABC):
@abstractmethod
def sound(self):
pass

class Tiger(Animal):
pass

leon = Tiger() # Возникнет ошибка, потому что в классе Tiger нет реализации метода sound
Или можно вот так

 class Animal: 
def __init_subclass__(cls):
if not hasattr(cls, 'sound'):
raise ValueError(f"Класс {cls.__name__} должен реализовать метод 'sound'")
return super().__init__(cls)


class Tiger(Animal):
pass

leon = Tiger() # тут возникнет ошибка с нашим текстом
Галина РыжоваУченик (148) 1 месяц назад
это понятно. Вопрос в том, как обработать эту ошибку. Например, выдать сообщение:"“Метод должен быть определен в дочернем классе"
Don BuhoУченик (170) 1 месяц назад
try except?
Галина РыжоваУченик (148) 1 месяц назад
причем обработать в рамках базового
Don Buho Ученик (170)
 class Animal: 
    def __init_subclass__(cls): 
        if not hasattr(cls, 'sound'): 
            print(f"Класс {cls.__name__} должен реализовать метод sound") 
        cls.__init__(cls) 
 
class Tiger(Animal): 
    pass 
 
class Jaguar(Animal): 
    pass 
 
 
leon = Tiger() # Класс Tiger должен реализовать метод sound 
alex = Jaguar() # Класс Jaguar должен реализовать метод sound 
Галина РыжоваУченик (148) 1 месяц назад
пасибо! Только ошибка генерируется от родительского класса, а не при вызове, но это, вроде как, логично.

from math import pi
class Shape():
def __init_subclass__(cls):
if not hasattr(cls, 'calculate_area'):
raise ValueError(f"Класс {cls.__name__} должен реализовать метод 'calculate_area'")
return super().__init__(cls)
class Trapezoid(Shape):
pass
-----------------------------------------
ValueError Traceback (most recent call last)
*
*
ValueError: Класс Trapezoid должен реализовать метод 'calculate_area'
Похожие вопросы