Как предотвратить переопределение функции в python

Есть ли способ сделать функцию класса недоступной для переопределения? что-то вроде Явы final ключевое слово. т. е. любой переопределяющий класс не может переопределить этот метод.

4 ответа

Решение

Проблема в том, что вы пытаетесь писать на Python, используя философию Java. Некоторые вещи переносятся, но не все. В Python вы можете делать следующее, и это прекрасно, но полностью противоречит тому, как Java думает об объектах.

class Thing(object):
    x = 1
something = Thing()
something.y = something.x

Если вы действительно этого хотите, вы можете попробовать код, размещенный здесь. Но, как вы видите, там много кода, чтобы заставить его делать то, что вы хотите. Также следует отметить, что даже тот, кто разместил код, говорит, что его можно пропустить, используя __dict__ или же object.__setattr__,

Вы можете добавить туда комментарий:

# We'll fire you if you override this method.

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

Использование двойного подчеркивания перед методом в классе - это не просто соглашение об именах. При этом имя метода искажается classname(_classname__methodname()),

Унаследовав класс с методом, имеющим двойное подчеркивание перед ним, для дочернего класса становится трудно переопределить указанный выше метод. Эта практика почти эквивалентна финалу в Java.

Да, не делай этого.

Я должен добавить к этому после голосования. Считается, что такие защитные механизмы идут вразрез с идеей Python, что "мы все здесь взрослые по обоюдному согласию". От кого вы хотите защитить такие функции? И если комментария не хватит, почему бы что-то "сильнее"?

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

Другие вопросы по тегам