Как плохо это должно переопределить метод от стороннего модуля?

Как плохо это должно переопределить метод класса от другого, стороннего модуля, в Python?

На самом деле пользователи могут создать матрицы NumPy, которые содержат числа с неуверенностью; идеально, я хотел бы, чтобы их код работал неизмененный (по сравнению с тем, когда код управляет матрицами плавающими); в частности, это было бы большим если инверсия матрицы m мог все еще быть получен с m.I, несмотря на то, что m.I должен быть вычислен с моим собственным кодом (оригинал I метод не работает, в целом).

Как плохо это для переопределения numpy.matrix. Я? С одной стороны, это действительно вмешивается в сторонний код, который я не люблю, поскольку это не может быть устойчиво (что, если другие модули делают то же? …). Другая проблема состоит в том что новый numpy.matrix. Я - обертка, которая включает маленькие издержки когда исходный numpy.matrix. Я могу на самом деле быть применен для получения обратной матрицы.

Разделяет матрицы NumPy на подклассы и только изменяет их I метод лучше? это вынудило бы пользователей обновить свой код и создать матрицы чисел с неуверенностью с m = matrix_with_uncert(…) (вместо того, чтобы продолжать использовать numpy.matrix(…), что касается матрицы плаваний), но возможно это - неудобство, которое должно быть принято ради устойчивости? Матричные инверсии могли все еще быть выполнены с m.I, который является хорошим …, С другой стороны, было бы хорошо, если пользователи могли бы создать все свои матрицы (плаваний или чисел с неуверенностью) с numpy.matrix() непосредственно, не имея необходимость потрудиться проверять на типы данных.

Любой комментарий или дополнительный подход приветствовался бы!

9
задан Makoto 28 August 2015 в 14:09
поделиться

3 ответа

C # не допускает множественного наследования .

-121--1481265-

С классическим ASP необходимо использовать Exit Function :

Function MyFunc(str)
  if (str = "ReturnNow!") then
    Response.Write("What up!")       
    Exit Function
  end if

  Response.Write("Made it to the end")     
End Function
-121--2112869-

Подклассирование (которое предполагает переопределение, так как термин обычно используется), как правило, гораздо предпочтительнее, чем «исправление обезьян» (вставление измененных методов в существующие классы или модули),

Например, если ваша функциональность полагается на исправление обезьян, она будет нарушать и останавливать модернизации, если в любое время класс, который вы используете, будет обновлен, чтобы быть реализованным в C (для скорости или специально для защиты от исправления обезьян). Сопровождающие сторонних пакетов ненавидят обезьяньи патчи, потому что это означает, что они получают фальшивые сообщения об ошибках от безбожных пользователей, которые (не знающие о них) на самом деле используют багги обезьяны-патч, который ломает сторонний пакет, где последние (если не сломанные обезьяны) безупречны. Вы уже заметили возможный хит исполнения.

Концептуально «матрица чисел с неопределенностью» - понятие, отличное от «матрицы чисел». Подклассика выражает это чисто, обезьянья заплатка пытается скрыть это. Это на самом деле корень того, что не так с обезьяньей заплаткой в целом: скрытый канал, работающий глобальными, скрытыми средствами, без ясности и прозрачности. Все многие практические проблемы происходят в некотором смысле от этой корневой концептуальной проблемы.

Я настоятельно призываю вас отказаться от латания обезьян в пользу чистых решений, таких как подкласс.

11
ответ дан 4 December 2019 в 15:18
поделиться

В общем, вполне приемлемо переопределение методов, которые ...

  • Намеренно разрешают переопределения
  • В том виде, в каком они документируются (выполнение LSP не повредит)

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

1
ответ дан 4 December 2019 в 15:18
поделиться

Зависит от того, что вы имеете в виду под «переопределить». Очевидно, вы можете использовать свою собственную версию, никаких проблем. Также вы можете переопределить его, создав подкласс, если это метод.

Вы также можете создать новый метод и вставить его в класс - практика, известная как monkey_patching. Примерно так:

from amodule import aclass

def newfunction(self, param):
    do_something()

aclass.oldfunction = newfunction

Это заставит все экземпляры aclass использовать вашу новую функцию вместо старой, включая экземпляры в любых "сторонних" модулях. Это работает и очень полезно, но считается очень уродливым и крайним средством. Это связано с тем, что в коде aclass нет ничего, что могло бы предположить, что вы переопределили метод, поэтому его сложно отлаживать. И еще хуже, когда два модуля monkeypatch совпадают. Тогда вы действительно запутаетесь.

1
ответ дан 4 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: