2016-09-15 10 views
5

Bu eski tarz sınıftır:Nesneden alt sınıf, metaclass olarak tanımlayıcı türüyle aynı mıdır?

class OldStyle: 
    pass 

Bu yeni bir tarzı sınıftır:

class NewStyle2: 
    __metaclass__ = type 

mi var:

class NewStyle(object): 
    pass 

Bu aynı zamanda yeni bir tarzı sınıftır NewStyle ve NewStyle2 arasında herhangi bir fark var mı?

object'dan devralmanın tek etkisinin aslında type meta sınıfını tanımlaması gerektiği izlenimine sahibim, ancak herhangi bir fark görmediğimden başka bir onay bulamıyorum.

cevap

2

Oldukça fazla evet, NewStyle ve NewStyle2 arasında fark yoktur. Her ikisi de type türünde, OldStyle ise classobj tipindedir.

Nesneden alt sınıf kullanıyorsanız, kullanılacak __class__ of object (meaning type) is going; Bir __metaclass__ that is going to get picked up sağlarsanız. hiçbir şey __metaclass__ olarak verilir ve siz object sizin için Py_ClassType is assigned as the metaclass miras yoksa

.

Her durumda, metaclass.__new__ aranacak. Py_ClassType.__new__ için tanımlanmış olan semantikleri (hiç inceledim, gerçekten) ve sınıfınızın tabanlarında type.__new__ it makes sure to pack object izler. Tabii

, benzer bir etki elde edilir:

aramanın anında type yapılır
cls = type("NewStyle3",(), {}) 

; Bu sadece daha büyük bir zorluk :-)

İlgili konular