使用元類

終於到了使用元類別了,可是一般來說,我們根本就用不上它,就像Python 界的領袖Tim Peters 說的:

元類別就是深度的魔法,99% 的用戶應該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那你就不需要它。那些實際用到元類的人都非常清楚地知道他們需要做什麼,而且根本不需要解釋為什麼要用元類。

元類別的主要用途是建立 API。一個典型的例子是 Django ORM。它允許你像這樣定義:

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

但是如果你這樣做的話:

guy  = Person(name='bob', age='35')
print guy.age

這並不會返回一個IntegerField 對象,而是會返回一個int,甚至可以直接從資料庫中取出資料。這是有可能的,因為 models.Model 定義了 __metaclass__ , 並且使用了一些魔法能夠將你剛剛定義的簡單的Person類轉變成對數據庫的一個複雜 hook。 Django 框架將這些看起來很複雜的東西透過暴露出一個簡單的使用元類別的 API 將其化簡,透過這個 API 重新創建程式碼,在背後完成真正的工作。

Python 中的一切都是對象,它們要麼是類別的實例,要麼是元類別的實例,除了 type。 type 其實是它自己的元類,在純 Python 環境中這可不是你能夠做到的,這是透過在實作層面耍一些小手段做到的。

繼續學習