2013-09-01 41 views
6

Python(僅限2?)查看變量__metaclass__的值,以確定如何根據類定義創建對象typeIt is possible to define __metaclass__ at the module or package level,在這種情況下,它適用於該模塊中的所有後續類定義。`__metaclass__ = type`的用途是什麼?

不過,我遇到下面的flufl.enum包的__init__.py

__metaclass__ = type 

由於默認元類如果__metaclass__沒有定義是type,就不會這樣有沒有效果? (如果__metaclass__被分配到更高的範圍,則此作業將恢復爲默認值,但我看不到這樣的作業。)它的用途是什麼?

回答

9

在Python 2中,聲明__metaclass__ = type發出聲明,否則將會創建舊式類創建新樣式類。只有舊式類使用模塊級別__metaclass__聲明。除非__metaclass__作爲類變量提供,否則新樣式類從它們的基類繼承它們的元類(例如object)。

該聲明實際上並未在上面鏈接的代碼中使用(__init__.py文件中沒有類聲明),但它可能是。我懷疑它是作爲一些樣板文件的一部分,使得Python 2代碼更像Python 3(所有類都是新樣式)工作。

0

是的,它沒有效果。這可能僅僅是來自flufl.enum的作者的一個誤解,或者來自以前代碼的剩餘部分。

「superpackage」__metaclass__聲明不起作用,因爲沒有Python超級包裝之類的東西。