繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM