gpt4 book ai didi

python - 为什么 Python 数据类禁止向 __init__ 方法传递参数?

转载 作者:行者123 更新时间:2023-12-01 05:13:23 24 4
gpt4 key购买 nike

此问题与 this question 相关关于 PyTables 元类。我试图对 PyTables 中的 IsDescription 元类进行子类化,以通过变量定义列的形状:

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 确定。这些是:

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

您无法在此处传递参数,因为此调用是由 python 解释器自动完成的。在 Python 2 中,元类在类本身中被定义为 __metaclass__ 属性,而在 Python 3 中,它是类定义中的参数。

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

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

关于python - 为什么 Python 数据类禁止向 __init__ 方法传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23712579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com