2016-09-15 32 views
5

Jest to klasa w starym stylu:Czy podklasy z obiektu są takie same, jak definiowanie typu jako metaklasy?

class OldStyle: 
    pass 

Jest to klasa new-style:

class NewStyle(object): 
    pass 

Jest to również klasa new-style:

class NewStyle2: 
    __metaclass__ = type 

Czy istnieje jakąkolwiek różnicę między NewStyle a NewStyle2?

Mam wrażenie, że jedynym skutkiem dziedziczenia z object jest zdefiniowanie metacylasu type, ale nie mogę znaleźć żadnego potwierdzenia tego, poza tym, że nie widzę żadnej różnicy.

Odpowiedz

2

W zasadzie tak, nie ma różnicy między NewStyle i NewStyle2. Oba są typu type podczas gdy OldStyle typu classobj.

Jeśli używasz podklasy z obiektu, użyj __class__ of object (meaning type) is going; jeśli dostarczasz __metaclass__ that is going to get picked up.

Jeśli nic nie zostanie dostarczone jako __metaclass__, a Ty nie odziedziczysz po object, Py_ClassType is assigned as the metaclass dla Ciebie.

We wszystkich przypadkach zostanie wywołany metaclass.__new__. W przypadku Py_ClassType.__new__ następują semantyki zdefiniowane (nigdy ich nie badałem, naprawdę) i type.__new__ it makes sure to pack object w bazach twojej klasy.

Oczywiście, podobny efekt uzyskuje się poprzez:

cls = type("NewStyle3",(), {}) 

gdzie połączenie jest wykonane bezpośrednio na type; to tylko większy problem :-)