2010-05-13 9 views
28

Questa domanda si basa su molte ipotesi. Se una ipotesi è sbagliata, allora l'intera faccenda cade. Sono ancora relativamente nuovo a Python e sono appena entrato nella fase curiosa/esplorativa.Classi finali in Python 3.x- qualcosa che Guido non mi sta dicendo?

È a mia conoscenza che Python non supporta la creazione di classi che non possono essere sottoclasse (classi finali). Tuttavia, mi sembra che la classe bool in Python non possa essere sottoclassata. Questo ha senso quando si considera l'intento della classe bool (perché si suppone che il bool abbia due valori: true e false), e sono contento di ciò. Quello che voglio sapere è come questa classe è stata contrassegnata come finale.

Quindi la mia domanda è: come ha fatto esattamente Guido a prevenire la sottoclasse di bool?

>>> class TestClass(bool): 
     pass 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    class TestClass(bool): 
TypeError: type 'bool' is not an acceptable base type 

questione connessa:Why I can't extend bool in Python?

risposta

40

È possibile simulare lo stesso effetto da Python 3.x abbastanza facilmente:

class Final(type): 
    def __new__(cls, name, bases, classdict): 
     for b in bases: 
      if isinstance(b, Final): 
       raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__)) 
     return type.__new__(cls, name, bases, dict(classdict)) 

class C(metaclass=Final): pass 

class D(C): pass 

darà il seguente risultato:

Traceback (most recent call last): 
    File "C:\Temp\final.py", line 10, in <module> 
    class D(C): pass 
    File "C:\Temp\final.py", line 5, in __new__ 
    raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__)) 
TypeError: type 'C' is not an acceptable base type 
Problemi correlati