2010-03-11 3 views
24

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

+3

У вас даже нет * частных * методов в Python, члены '__xxx' только затенены. Я действительно был бы удивлен, если бы было что-то вроде ключевого слова «final». – Boldewyn

+0

Почему? Каков прецедент для предотвращения этого? Люди могут читать ваш источник и переписывать функцию. Что ты пытаешься сделать? –

+0

Я не знаю, почему все вы предполагаете, что я хочу это для предотвращения кого-то еще от переопределения - я хочу, чтобы я не смог от случайного переопределения его в будущем. Предполагая, что у меня есть относительно глубокое дерево наследования, и один из «более глубоких» классов случайно переопределит func (забыв об этом даже) – olamundo

ответ

31

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

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

Если вы действительно хотите, вы можете попробовать code posted here. Но, как вы видите, есть много кода, чтобы заставить его делать то, что вы хотите. Следует также отметить, что даже человек, разместивший код, говорит, что он может быть передан с использованием __dict__ или object.__setattr__.

+4

-1 Такой код заслуживает Мемориальной премии Мажино за бесполезные механизмы защиты. –

+17

Почему -1? Я не писал код, с которым я связан, и я не поощрял его использование. Я нашел его с поиском google и подумал, что это помогло доказать мою точку зрения, что попытка принудительного исполнения final не является хорошей идеей в python. – unholysampler

+1

Для связи с ним. –

70

Вы можете поместить комментарий там к действию:

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

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

+2

+1 И если это было обнаружено в отчете об ошибке пользователя, мы будем стрелять из стеной, которые не тестировали приложение должным образом. –

+4

Это должно быть частью строк документа (т. Е. Спецификацией API), а не комментарием – vog

0

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

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

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

Смежные вопросы