为什么Python元类禁止将参数传递给__init__方法?

时间:2014-05-17 14:41:17

标签: python metaclass pytables

此问题与this question有关PyTables元类的问题有关。我试图在PyTables中继承IsDescription元类,用变量定义Column的形状:

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是元类。

我的问题(链接问题没有回答,我无法通过Google搜索找到任何内容)是:为什么元类会禁止此功能?它是特定于这个元类,还是所有元类的通用的?

1 个答案:

答案 0 :(得分:2)

这对所有元类都是通用的。 实际上,当创建类并且传递的参数总是相同时,会生成元类,并由python确定。 那些是:

  • 要创建的类的名称
  • 此类的继承类列表。它是类引用的元组。默认情况下,对于新式类,它是object
  • 要创建的类的所有字段的字典

你不能在这里传递参数,因为这个调用是由python解释器自动完成的。在python 2中,元类在类本身中被定义为__metaclass__属性,而它是Python 3中类的定义中的参数。

元类的__new__方法在类的__init__方法之前调用,因此,获取与类相同的参数。您可以在元类中初始化而不是在构造函数中更改类的行为。

如果要定义元类的参数,可以使用某些特定字段在要定义的类中定义。您还可以编写一个类似于元类的函数来为您创建类,并且您将能够向该函数添加参数。但我不知道PyTables以及你的确切要求或可能性。