(Python 3.x) Хочу создать, что то типа своей переменной
Хочу сделать, что то типа своей переменной Fuel. Fuel это целое(int) число, но со своими доп. методами. Спрашивал у гугла, но он не понимает, что я от него хочу. В виде ответа согласен на ссылку, где объясняется как создавать свои переменные в Python.
В общем, какой магический метод нужно переопределить в классе Fuel, чтобы ниже приведенные примеры заработали так как мне нужно? (см. код)
class Fuel:
def __init__(self, liter):
self.liter = liter
def __add__(self, other):
return self.liter + other.liter
def __sub__(self, other):
return self.liter - other.liter
def get_distance(self, car):
return self.liter / car.fuel_consumption
# ... дальше идут очень нужные методы =)
# пример №1
# какой магический метод нужно переопределить в классе Fuel, чтобы ниже приведенный пример заработал?
barrels = [Fuel(700), Fuel(300), Fuel(500), Fuel(200), Fuel(300)]
print(sum(barrels))
# пример №2
# какой магический метод нужно переопределить в классе Fuel, что бы оба принта печатали это: <class 'int'> 123
barrel = Fuel(123)
print(type(barrel.liter), barrel.liter) # <class 'int'> 123
print(type(barrel), barrel) # <class 'int'> 123
Ответы (2 шт):
Насчёт первого варианта: используйте магический метод __radd__(self, other), где возвращайте self.liter + other.
Переработанный код выглядит так:
class Fuel:
def __init__(self, liter):
self.liter = liter
def __radd__(self, other):
return self.liter + other
barrels = [Fuel(700), Fuel(300), Fuel(500), Fuel(200), Fuel(300)]
print(sum(barrels)) >>> 2000
В общем все оказалось намного проще, просто нужно было унаследовать класс int. Еще, не до конца понял как это работает, нужно попрактиковаться. Я только изучаю Python и это мой пробел в ооп, так что сильно не пинайте =)
class Fuel(int):
def __init__(self, liter):
super().__init__()
self.liter = liter
def get_distance(self, car):
return self.liter / car.fuel_consumption
# ... дальше идут еще очень нужные методы =)
barrels = [Fuel(700), Fuel(300), Fuel(500), Fuel(200), Fuel(300)]
print(sum(barrels)) # 2000
barrel1 = Fuel(123)
barrel2 = Fuel(111) + Fuel(222)
print(type(barrel1.liter), barrel1.liter) # <class 'int'> 123
print(type(barrel2), barrel2) # <class 'int'> 333
Вывод программы:
2000
<class 'int'> 123
<class 'int'> 333