【问题标题】:Why do Python metaclasses prohibit passing paramters to the __init__ method?为什么 Python 元类禁止将参数传递给 __init__ 方法?
【发布时间】:2014-05-17 14:41:17
【问题描述】:

这个问题与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是一个元类。

我的问题(在链接的问题中没有得到回答,而且我无法通过谷歌搜索找到任何东西)是:为什么元类会禁止此功能?它是特定于这个元类的,还是通用的所有元类?

【问题讨论】:

    标签: python metaclass pytables


    【解决方案1】:

    这对所有元类都是通用的。 事实上,元类是在创建类时实例化的,并且传递的参数始终相同,并由 python 确定。 这些是:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2013-12-24
      • 2015-12-26
      • 2011-08-18
      相关资源
      最近更新 更多