2009-05-04 13 views
6

Tôi đã cố gắng tìm hiểu về metaclasses trong Python. Tôi có ý tưởng chính, nhưng tôi dường như không thể kích hoạt cơ chế. Như tôi đã hiểu, bạn có thể chỉ định M là metaclass khi xây dựng một lớp K bằng cách đặt __metaclass__ thành M ở cấp độ toàn cầu hoặc cấp lớp. Để kiểm tra điều này ra, tôi đã viết chương trình sau đây:Không nên __metaclass__ buộc việc sử dụng một metaclass trong Python?

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta: 
    __metaclass__ = M 

p(2) 
__metaclass__ = M 
class GlobalMeta: pass 

p(3) 
M('NotMeta2',(), {}) 

p(4) 

Tuy nhiên, khi tôi chạy nó, tôi nhận được kết quả như sau:

 
C:\Documents and Settings\Daniel Wong\Desktop>python --version 
Python 3.0.1 

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py 
1 
2 
3 
The rain in Spain 
4 

nên tôi không thấy "Mưa ở Tây Ban Nha" sau 1 và 2? Những gì đang xảy ra ở đây?

+1

Dấu hai chấm "không ... không ép buộc" rất khó phân tích cú pháp. Bạn có thể sửa câu hỏi được không? –

+0

Cảm ơn phản hồi. Tôi nghĩ rằng bây giờ phải dễ hiểu hơn. – allyourcode

Trả lời

13

Trong Python 3 (mà bạn đang sử dụng) metaclasses được quy định bởi một tham số từ khóa trong định nghĩa lớp:

class ClassMeta(metaclass=M): 
    pass 

Xác định một tài sản __metaclass__ lớp hoặc biến toàn cầu là cú pháp cũ từ Python 2.x và không còn được hỗ trợ. Xem thêm "What's new in Python 3"PEP 2115.

2

này hoạt động như bạn mong đợi trong Python 2.6 (trở về trước), nhưng trong 3,0 metaclasses được quy định khác nhau:

class ArgMeta(metaclass=M): ... 
2

Cú pháp của metaclasses có changed bằng Python 3.0. Thuộc tính __metaclass__ không còn đặc biệt ở cấp độ cũng như cấp mô-đun. Để làm được những gì bạn đang cố gắng để làm, bạn cần phải xác định metaclass như một đối số từ khóa để báo cáo kết quả class:

p = print 

class M(type): 
    def __init__(*args): 
     type.__init__(*args) 
     print("The rain in Spain") 

p(1) 
class ClassMeta(metaclass=M): pass 

Sản lượng:

1 
The rain in Spain 

Như bạn mong muốn.