2015-08-13 23 views
9

Python 3'te, object, type'un bir örneğidir ve type aynı zamanda bir object örneğidir!Python 3: Nesne nasıl bir örnek olabilir?

Her sınıfın diğerinden nasıl türetilmesi mümkündür?

Uygulama ayrıntıları nedir?

Bu, isinstance(sub, base) kullanılarak kontrol Python belgelerine göre olan, kontrol alt sınıf temel sınıfından türetilir edin:

isinstance(object, type) 
Out[1]: True 

isinstance(type, object) 
Out[2]: True 

cevap

16

Bu Python kenar durumlarda biridir:

  • Python'daki her şey bir nesnedir, bu nedenle object her şeyin taban türü olduğundan, type (Python'da bir şey olmak), object'un bir örneğidir. object yana
  • object da objecttype bir örneği yapan bir tip,, taban türü her şeyin olup. bu ilişki size Python kendi şeyler ile çoğaltabilirsiniz şey olmadığını

Not. Bu, dile yerleşik tek bir istisnadır. uygulama tarafında


, iki isim PyBaseObject_Type ( object için) ve PyType_Type ( type için) ile temsil edilir.

type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b) 
{ 
    do { 
     if (a == b) 
      return 1; 
     a = a->tp_base; 
    } while (a != NULL); 

    return (b == &PyBaseObject_Type); 
} 

Bu aslında a tipi hiyerarşisini yukarı gidiyor tutar ve kontrol eder: Eğer isinstance kullandığınızda

, tip check-in çok son adımda, her şey başarısız oldu-edilir type_is_subtype_base_chain tarafından yapılır sonra b'a karşı sonuç türü. Bulamazsa, son çare b'un aslında object olup olmadığını kontrol etmektir, bu durumda işlev true olarak geri döner: her şey bir nesnedir. Yani “her şey bir object örneğidir” kısmı aslında örnek kontrolüne kodlanmıştır.

PyTypeObject PyBaseObject_Type = { 
    PyVarObject_HEAD_INIT(&PyType_Type, 0) 
    "object",         /* tp_name */ 
    sizeof(PyObject),       /* tp_basicsize */ 
    … 

PyVarObject_HEAD_INIT esasen taban türü dahil, çekirdek türü bilgisi şeyler ayarlar: basitçe declaration of PyBaseObject_Type bu şekilde tanımlanmış çünkü

Ve object bir type neden gelince

, bu aslında daha basittir PyType_Type.Her şey bir nesnedir yana object da object bir örneğidir,

  • :

    aslında iki tane daha bu ilişkinin sonucu vardır PyType_Type yana isinstance(object, object)

  • aynı PyVarObject_HEAD_INIT ile uygulanan, type olduğunu ayrıca bir tür: isinstance(type, type).
+0

Bu davranışı sanal alt sınıflar ile taklit edebildiğinizden eminim. – Dunes