2010-05-13 8 views
28

Esta pregunta se basa en muchas suposiciones. Si una suposición es incorrecta, entonces todo se cae. Todavía soy relativamente nuevo en Python y acabo de ingresar a la fase curiosa/exploratoria.Clases finales en Python 3.x- algo que Guido no me está diciendo?

Entiendo que Python no admite la creación de clases que no se pueden subclasificar (clases finales). Sin embargo, me parece que la clase bool en Python no se puede subclasificar. Esto tiene sentido cuando se considera la intención de la clase bool (porque se supone que bool solo tiene dos valores: verdadero y falso), y estoy contento con eso. Lo que quiero saber es cómo esta clase se marcó como final.

Así que mi pregunta es: ¿cómo exactamente Guido logró evitar la subclasificación de 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 

pregunta relacionada:Why I can't extend bool in Python?

Respuesta

40

Se puede simular el mismo efecto desde Python 3.x con bastante facilidad:

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á el siguiente resultado:

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 
Cuestiones relacionadas