2012-05-08 36 views
5

W języku Python 2.x wszystkie nowe style dziedziczą od object niejawnie lub jawnie. Następnie spójrz na to:Klasy w starym stylu, klasy nowego stylu i metaki

>>> class M(type): 
...  pass 
... 
>>> class A: 
...  __metaclass__ = M 
... 
>>> class B: 
...  pass 
... 
>>> a = A() 
>>> b = B() 
>>> type(A) 
<class '__main__.M'> 
>>> type(a) 
<class '__main__.A'> 

Czy to znaczy A jest klasą nowy styl? Ale tak czy inaczej A nie dziedziczy po object, prawda?

>>> type(B) 
<class 'classobj'> 
>>> type(b) 
<type 'instance'> 

OK, B to klasyczna klasa, czyż nie?

>>> isinstance(A, object) 
True 
>>> isinstance(B, object) 
True 

dlaczego są przypadki zarówno A i B przypadki object?

Jeśli B jest instancją , wówczas type(B) nie byłby classobj, prawda?

+4

Wszystko jest przedmiotem! – orlp

+0

Nie powinieneś wstawiać rzeczy '__slots__' w tym pytaniu. To zupełnie inne pytanie. –

+0

@ChrisMorgan, tak, właśnie to sobie uświadomiłem. – Alcott

Odpowiedz

5

O metaclassesach można przeczytać tutaj: http://docs.python.org/reference/datamodel.html#customizing-class-creation. Zasadniczo metaclasy są przeznaczone do pracy z nowymi klasami stylów. Kiedy piszesz:

class M(type): 
    pass 

i użyć:

class C: 
    __metaclass__ = M 

można utworzyć nowy obiekt w stylu, ponieważ droga M jest zdefiniowane (Domyślna implementacja wykorzystuje type utworzyć klasę w nowym stylu). Zawsze możesz zaimplementować własny metaclass, który tworzy klasy w starym stylu przy użyciu types.ClassType.

1

O szczelinach można przeczytać tutaj http://docs.python.org/release/2.5.2/ref/slots.html, fragment:

Domyślnie instancje klas zarówno starych i nowych stylów mieć słownika do przechowywania atrybutów.

W przypadku zajęć w nowym stylu można dodać __slots__, a następnie nie zostanie utworzony słownik dla poszczególnych obiektów.

Powiązane problemy