Код: Выделить всё
class MyFloat(float):
def __new__(cls,number,extra):
return super().__new__(cls,number)
def __init__(self,number,extra):
float.__init__(number)
self.extra = extra
Теперь предположим, что мы хотим, чтобы вместо этого он возвращал MyFloat, равный MyFloat(1.0,'hi'). Первой мыслью было бы добавить
Код: Выделить всё
def __add__(self,other):
return MyFloat(self+other,self.extra)
Есть есть несколько очевидных способов справиться с этим, но все они кажутся очень хаотичными. Есть преобразование в float:
Код: Выделить всё
def __add__(self,other):
return MyFloat(float(self)+other,self.extra)
Код: Выделить всё
def __add__(self,other):
return MyFloat(float.__add__(self,other),self.extra)
А что, если я захочу получить доступ неизменяемая часть в другом контексте? Например, если я хочу, чтобы дополнительная часть по какой-то причине была обновлена до f"{self+1.0}", где self здесь является неизменяемой частью, как мне это получить часть настроена?
Обновление. Я провел небольшое тестирование скорости и нашел кое-что интересное. Использование float.__add__ (или super().__add__) относительно медленное и обычно занимает более чем на 20% больше времени, чем мой базовый код (который выполняет все те же вычисления и т. д., но требует входные данные как отдельные части, а не как одна переменная). Приведение к плавающему типу с помощью float(self) и float(other) работает лучше, обычно примерно на 15 % медленнее, чем базовый вариант. Выполнение self.real иother.real примерно на 12% медленнее базового уровня, что еще больше улучшается...
Как ни странно, это самый быстрый подход, который я когда-либо пробовал. найдено, чтобы использовать +self и +other - это снижает скорость примерно на 6-8% по сравнению с базовым уровнем. Я не уверен, почему это быстрее, чем float(self), поскольку, насколько я могу судить, базовый код должен быть в основном таким же, но он вполне согласован.
Мне было бы интересно узнать, знает ли кто-нибудь более эффективный подход, чем этот.
Подробнее здесь: https://stackoverflow.com/questions/790 ... table-type