Каков наилучший способ доступа к неизменяемой части при создании подкласса неизменяемого типа?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Каков наилучший способ доступа к неизменяемой части при создании подкласса неизменяемого типа?

Сообщение Anonymous »

Предположим, вы хотите создать новый подкласс для float, используя следующий код:

Код: Выделить всё

class MyFloat(float):
def __new__(cls,number,extra):
return super().__new__(cls,number)

def __init__(self,number,extra):
float.__init__(number)
self.extra = extra
Насколько я понимаю, это хорошая практика для этой части класса. И если мы остановимся на этом, то для x=MyFloat(0.0,'hi') x+1 будет иметь значение 1,0 (как число с плавающей запятой), как и ожидалось.
Теперь предположим, что мы хотим, чтобы вместо этого он возвращал MyFloat, равный MyFloat(1.0,'hi'). Первой мыслью было бы добавить

Код: Выделить всё

    def __add__(self,other):
return MyFloat(self+other,self.extra)
но, конечно, если вы попробуете это сделать, это приведет к ошибке рекурсии, как она себя называет. (да, я знаю, что при добавлении двух MyFloat будет добавлен только первый, это, по сути, минимальный пример того, о чем я спрашиваю).
Есть есть несколько очевидных способов справиться с этим, но все они кажутся очень хаотичными. Есть преобразование в float:

Код: Выделить всё

    def __add__(self,other):
return MyFloat(float(self)+other,self.extra)
или вызвать float.__add__ вместо использования +, как:

Код: Выделить всё

    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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»