Se un'API consente di fornire sottoclassi di una determinata classe e chiama i metodi (legalmente) sovrascritti, ma anche altri metodi API di quella classe con nomi semplici come "aggiungi", sovrascrivendo accidentalmente tali metodi potrebbe portare a -track-down bugs. È meglio avvisare almeno l'utente.
I casi in cui un utente desidera/ha bisogno di eseguire l'override di un metodo che interromperà completamente l'API è praticamente pari a zero. I casi in cui un utente ignora per errore qualcosa che non dovrebbe e ha bisogno di ore per trovare il colpevole sono molto più frequenti. Il debug del comportamento errato causato da questo può essere ingombrante.
Questo è il modo che uso per mettere in guardia o proteggere gli attributi impedire che vengano accidentalmente sovrascritti:
def protect(*protected):
"""Returns a metaclass that protects all attributes given as strings"""
class Protect(type):
has_base = False
def __new__(meta, name, bases, attrs):
if meta.has_base:
for attribute in attrs:
if attribute in protected:
raise AttributeError('Overriding of attribute "%s" not allowed.'%attribute)
meta.has_base = True
klass = super().__new__(meta, name, bases, attrs)
return klass
return Protect
è possibile utilizzarlo in questo modo:
class Parent(metaclass=protect("do_something", "do_something_else")):
def do_something(self):
'''This is where some seriously important stuff goes on'''
pass
class Child(Parent):
def do_something(self):
'''This will raise an error during class creation.'''
pass
In breve, non proprio in python. http://stackoverflow.com/questions/2425656/how-to-prevent-a-function-from-being-overridden-in-python – birryree
Btw, questo mi ha fatto pensare, rileggere e crack su http://steve-yegge.blogspot.com/2010/07/wikileaks-to-leak-5000-open-source-java.html - grazie! – delnan
@delnan grazie per il link. Roba buona! –