使用元類
終於到了使用元類別了,可是一般來說,我們根本就用不上它,就像Python 界的領(lǐng)袖Tim Peters 說的:
元類別就是深度的魔法,99% 的用戶應(yīng)該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那你就不需要它。那些實(shí)際用到元類的人都非常清楚地知道他們需要做什麼,而且根本不需要解釋為什麼要用元類。
元類別的主要用途是建立 API。一個(gè)典型的例子是 Django ORM。它允許你像這樣定義:
class Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField()
但是如果你這樣做的話:
guy = Person(name='bob', age='35') print guy.age
這並不會(huì)返回一個(gè)IntegerField 對(duì)象,而是會(huì)返回一個(gè)int,甚至可以直接從資料庫中取出資料。這是有可能的,因?yàn)?models.Model 定義了 __metaclass__ , 並且使用了一些魔法能夠?qū)⒛銊倓偠x的簡(jiǎn)單的Person類轉(zhuǎn)變成對(duì)數(shù)據(jù)庫的一個(gè)複雜 hook。 Django 框架將這些看起來很複雜的東西透過暴露出一個(gè)簡(jiǎn)單的使用元類別的 API 將其化簡(jiǎn),透過這個(gè) API 重新創(chuàng)建程式碼,在背後完成真正的工作。
Python 中的一切都是對(duì)象,它們要麼是類別的實(shí)例,要麼是元類別的實(shí)例,除了 type。 type 其實(shí)是它自己的元類,在純 Python 環(huán)境中這可不是你能夠做到的,這是透過在實(shí)作層面耍一些小手段做到的。