Есть два варианта.
1. Фабричный метод
x = Frac.create_by_type(2, 5)
y = Frac.create_by_type(2.1, 5)
Пример реализации:
class Frac:
...
@classmethod
def create_by_type(cls, a, b):
if isinstance(a, float):
return a / b
return cls(a, b)
Если вы хотите использовать конструктор Frac
напрямую,
2. Переопределение Frac.__new__
метода
class Frac:
def __new__(cls, a, b):
if isinstance(a, float):
return a / b
return super().__new__(cls)
def __init__(self, a, b):
self.a = a
self.b = b
f1 = Frac(2, 5)
f2 = Frac(2.1, 5)
print(type(f1))
print(type(f2))
print(f1.a, f1.b)
output:
<class '__main__.Frac'>
<class 'float'>
2 5
Но переопределение __new__
метода может быть сложным, поэтому я не уверен, что рекомендую его.