使用元類
終于到了使用元類了,可是一般來說,我們根本就用不上它,就像Python 界的領(lǐng)袖 Tim Peters 說的:
元類就是深度的魔法,99% 的用戶應(yīng)該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。那些實際用到元類的人都非常清楚地知道他們需要做什么,而且根本不需要解釋為什么要用元類。
元類的主要用途是創(chuàng)建 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,甚至可以直接從數(shù)據(jù)庫中取出數(shù)據(jù)。這是有可能的,因為 models.Model 定義了 __metaclass__ , 并且使用了一些魔法能夠?qū)⒛銊倓偠x的簡單的Person類轉(zhuǎn)變成對數(shù)據(jù)庫的一個復(fù)雜 hook。Django 框架將這些看起來很復(fù)雜的東西通過暴露出一個簡單的使用元類的 API 將其化簡,通過這個 API 重新創(chuàng)建代碼,在背后完成真正的工作。
Python 中的一切都是對象,它們要么是類的實例,要么是元類的實例,除了 type。type 實際上是它自己的元類,在純 Python 環(huán)境中這可不是你能夠做到的,這是通過在實現(xiàn)層面耍一些小手段做到的。