[英]Why do Python metaclasses prohibit passing paramters to the __init__ method?
此问题与有关PyTables元类的问题有关。 我试图在IsDescription
中继承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 = ...
会产生相同的错误。
在此SO问题中 ,报告了相同的错误,其原因可归因于IsDescription
是元类的事实。
我的问题(链接的问题未回答,而且我无法通过Googling找到任何内容)是:为什么元类禁止此功能? 它是特定于此元类,还是所有元类都通用?
这是所有元类通用的。 实际上,创建类时实例化了一个元类,并且传递的参数始终相同,并由python确定。 那些是 :
object
您无法在此处传递参数,因为此调用由python解释器自动完成。 在python 2中,一个元类在类本身中定义为__metaclass__
属性,而在Python 3中该类是该类定义中的参数。
元类的__new__
方法在类的__init__
方法之前被调用,因此采用与您的类相同的参数。 您可以在元类中而不是在构造函数中更改类在初始化时的行为。
如果要定义元类的参数,则可以使用例如要定义的类中的某些特定字段。 您还可以编写一个像元类一样的函数来为您创建一个类,并且可以向该函数添加参数。 但是我不知道PyTables以及您的确切要求或可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.