2010-05-13 3 views
28

Cette question est construite sur de nombreuses hypothèses. Si une hypothèse est fausse, alors l'ensemble tombe. Je suis encore relativement nouveau à Python et je viens d'entrer dans la phase curieuse/exploratoire.Dernières classes en Python 3.x- quelque chose que Guido ne me dit pas?

Je crois comprendre que Python ne supporte pas la création de classes qui ne peuvent pas être sous-classées (final classes). Cependant, il me semble que la classe bool en Python ne peut pas être sous-classée. Cela a du sens quand on considère l'intention de la classe bool (parce que bool n'est supposé avoir que deux valeurs: true et false), et j'en suis content. Ce que je veux savoir est comment cette classe a été marquée comme finale.

Donc, ma question est: comment exactement Guido a-t-il réussi à empêcher la sous-classe 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 

question connexe:Why I can't extend bool in Python?

Répondre

40

Vous pouvez simuler le même effet de Python 3.x assez facilement:

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 

donnera la sortie suivante:

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