2014-05-17 25 views
2

這個問題與關於PyTables元類的this question有關。我試圖在子類的PyTables元類IsDescription,通過一個變量,以定義列的形狀:爲什麼Python元類禁止將參數傳遞給__init__方法?

import tables 
class MyClass(tables.IsDescription): 
    def __init__(self, param): 
     var1 = tables.Float64Col(shape=(param)) 

MyClass1 = MyClass(12) 

這引發錯誤:TypeError: object.__new__()沒有參數。使用self.var1 = ...給出了相同的錯誤。

this SO question報告了同樣的錯誤,其原因歸因於IsDescription是元類。

我的問題(這個問題沒有在鏈接問題上回答,也沒有通過谷歌搜索找到任何東西)是:爲什麼元類禁止這個功能?它是特定於這個元類還是所有元類的通用?

回答

1

這對所有元類都是通用的。 事實上,當一個類正在被創建並且傳遞的參數總是相同的時候,元類會被立即執行,並由python來確定。 這些都是:

  • 類的名字爲這個類來創建
  • 繼承類的列表。這是一個類參考的元組。默認情況下,新式類是object
  • 類的所有領域的字典要創建

,因爲這調用由Python解釋器自動完成你不能在這裏通過你的參數。在Python 2,元類被定義爲類本身__metaclass__屬性,而它在定義中的參數在類在Python 3

元類的__new__方法的__init__方法之前剛纔打電話給你類等等,和你的班級一樣。你可以在元類的初始化時改變你的類的行爲,而不是在構造函數中。

如果要爲元類定義參數,例如可以使用要定義的類中定義的某些特定字段。你也可以編寫一個像元類一樣的函數爲你創建一個類,並且你將能夠爲該函數添加參數。但我不知道PyTables和您的具體要求或可能性。

相關問題