2010-05-13 9 views
28

Bu soru birçok varsayımın üzerine kurulmuştur. Bir varsayım yanlış ise, o zaman tüm şey düşer. Hala Python için nispeten yeni ve meraklı/keşif aşamasına yeni girdim.Python 3.x'deki final dersleri - Guido bir şey anlatmıyor mu?

Python'un alt sınıflara dönüştürülemeyen sınıfların oluşturulmasını desteklemediği benim anlayışım (son sınıfları). Ancak, Python'daki bool sınıfının alt sınıflara ayrılmayacağı anlaşılıyor. Bu, bool sınıfının amacı göz önüne alındığında mantıklıdır (çünkü bool sadece iki değere sahip olduğu varsayılır: doğru ve yanlış) ve ben bundan memnun olurum. Bilmek istediğim, numaralı telefonun bu sınıfın final olarak nasıl işaretlendiğidir.

Sorularım: Guido, boolun alt sınıflamasını engellemeyi nasıl başardı?

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

İlgili soru:Why I can't extend bool in Python?

cevap

40

Sen oldukça kolay Python 3.x aynı etkiyi simüle edebilirsiniz: belgelerine

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 
11

Yalnızca C API ile bunu yapabilirdi. Yazım nesnesinin tp_flags'un Py_TPFLAGS_BASETYPE bitini temizleyin.

Böyle: http://svn.python.org/projects/python/trunk/Objects/boolobject.c (vs intobject.c nerede Py_TPFLAGS_BASETYPE ayarlanmıştır).

+0

Linki: http://docs.python.org

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 

şu çıktıyı verecektir /c-api/typeobj.html#Py_TPFLAGS_BASETYPE –