2012-05-08 40 views
5

Trong Python 2.x, tất cả các lớp kiểu mới kế thừa từ object ngầm hoặc rõ ràng. Sau đó, xem xét điều này:Lớp học kiểu cũ, lớp học kiểu mới và metaclasses

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

Điều này có nghĩa A là một lớp học kiểu mới? Tuy nhiên, A không kế thừa từ object, đúng không?

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

OK, B là một lớp học cổ điển phải không?

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

tại sao trường hợp của cả hai AB trường hợp của object?

Nếu B là phiên bản object, thì type(B) sẽ không là classobj, phải không?

+4

Mọi thứ đều là đối tượng! – orlp

+0

Bạn không nên đặt điều '__slots__' trong câu hỏi này. Đó là một câu hỏi khác hoàn toàn. –

+0

@ChrisMorgan, vâng, tôi mới nhận ra điều đó. – Alcott

Trả lời

5

Giới thiệu về metaclasses bạn có thể đọc tại đây: http://docs.python.org/reference/datamodel.html#customizing-class-creation. Nói chung metaclasses được thiết kế để làm việc với các lớp phong cách mới. Khi bạn viết:

class M(type): 
    pass 

và bạn sử dụng:

class C: 
    __metaclass__ = M 

bạn sẽ tạo ra một đối tượng kiểu mới, vì con đường M được định nghĩa (thực hiện mặc định sử dụng type để tạo ra một lớp kiểu mới). Bạn luôn có thể triển khai metaclass của riêng mình để tạo các lớp kiểu cũ sử dụng types.ClassType.

1

Về khe bạn có thể đọc ở đây http://docs.python.org/release/2.5.2/ref/slots.html, một đoạn:

Theo mặc định, các trường hợp của cả hai lớp cũ và kiểu mới có một cuốn từ điển để lưu trữ thuộc tính.

Đối với các lớp kiểu mới, bạn có thể thêm __slots__, khi đó từ điển cho mỗi đối tượng sẽ không được tạo.

Các vấn đề liên quan