Можно ли использовать имя класса как условие?
Всем привет! Прошу прощения за непонятный вопрос, постараюсь пояснить. К примеру вот небольшой код, который я написал:
class Table:
def __init__(self, width, height, radius):
self._width = width
self._height = height
self._radius = radius
class RTable(Table):
def calcarea(self):
return f'Площадь стола равна {self._width * self._height}'
class ETable(Table):
def calcarea1(self):
return f'Площадь стола равна {3,14 * (self._radius ** 2)}'
Подскажите, пожалуйста, можно ли как-то сделать, чтобы если экземпляр принадлежал классу RTable, то приходилось бы указывать 2 аргумента, а если классу ETable, то для экземпляра указывался бы только один аргумент и интерпретатор не ругался на недостаток аргументов?
Я понимаю, что можно задать в каждом дочернем классе свой инициализатор init и не париться. Но я бы хотел сделать это как-то похитрее. Можно ли как-то переопределить конструктор класса new и указать в нём что-то типа if класс такой-то, то бери столько-то аргументов, elif класс такой-то , то бери столько-то.
Прошу прощения за идиотскую формулировку вопроса =\
Ответы (1 шт):
Сделайте параметры конструктора класса Table - ключевыми.
def __init__(self, width=0, height=0, radius=0):
import math
class Table:
# def __init__(self, width, height, radius):
def __init__(self, width=0, height=0, radius=0): # + width=0, height=0, radius=0
self._width = width
self._height = height
self._radius = radius
class RTable(Table):
def calcarea(self):
return f'Площадь стола равна {self._width * self._height}'
class ETable(Table):
def calcarea1(self):
# return f'Площадь стола равна {3,14 * (self._radius ** 2)}' # нет 3,14
# так
# return f'Площадь стола равна {3.14 * (self._radius ** 2)}' # да 3.14
# или так
return f'Площадь стола равна {math.pi * (self._radius ** 2)}' # да pi
rTable = RTable(width=10, height=20)
print(rTable._width, rTable._height, rTable._radius)
print(rTable.calcarea())
eTable = ETable(radius=12)
print(eTable._width, eTable._height, eTable._radius)
print(eTable.calcarea1())