Каков наилучший способ доступа к неизменяемой части при создании подкласса неизменяемого типа?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 здесь является неизменяемой частью, как мне это получить часть настроена?

Подробнее здесь: https://stackoverflow.com/questions/790 ... table-type
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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