此问题与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搜索找到任何内容)是:为什么元类会禁止此功能?它是特定于这个元类,还是所有元类的通用的?
答案 0 :(得分:2)
这对所有元类都是通用的。 实际上,当创建类并且传递的参数总是相同时,会生成元类,并由python确定。 那些是:
object
你不能在这里传递参数,因为这个调用是由python解释器自动完成的。在python 2中,元类在类本身中被定义为__metaclass__
属性,而它是Python 3中类的定义中的参数。
元类的__new__
方法在类的__init__
方法之前调用,因此,获取与类相同的参数。您可以在元类中初始化而不是在构造函数中更改类的行为。
如果要定义元类的参数,可以使用某些特定字段在要定义的类中定义。您还可以编写一个类似于元类的函数来为您创建类,并且您将能够向该函数添加参数。但我不知道PyTables以及你的确切要求或可能性。