Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 元类不';我不能继承_Python_Python 3.x_Metaclass - Fatal编程技术网

Python 元类不';我不能继承

Python 元类不';我不能继承,python,python-3.x,metaclass,Python,Python 3.x,Metaclass,在以下代码中: 类元(类型): 定义(cls、名称、基数、属性): 印刷品(名称) 返回类型(名称、基数、属性) 类A(对象,元类=元): def do_复杂任务(自我): 通过 B(A)类: def do_次要任务(自我): 通过 我希望看到A和B都被打印出来,但我看到元类只应用于A。我怎样才能解决这个问题?我的目标是预处理A的所有子类的字段,我希望在每个子类中省略键入metaclass=Meta。您的元类实际上不是Meta。如果您执行类型(a),您将得到,因为您覆盖了Meta.\uuuuu

在以下代码中:

类元(类型):
定义(cls、名称、基数、属性):
印刷品(名称)
返回类型(名称、基数、属性)
类A(对象,元类=元):
def do_复杂任务(自我):
通过
B(A)类:
def do_次要任务(自我):
通过

我希望看到
A
B
都被打印出来,但我看到元类只应用于
A
。我怎样才能解决这个问题?我的目标是预处理
A
的所有子类的字段,我希望在每个子类中省略键入
metaclass=Meta

您的元类实际上不是
Meta
。如果您执行
类型(a)
,您将得到
,因为您覆盖了
Meta.\uuuuuuu新的
以返回普通的
类型,而不是
Meta
实例

一般来说,与普通类一样,对于元类,您希望覆盖
\uuu init\uuu
,并让
\uu new\uuu
执行默认操作

class Meta(type):
    def __init__(self, name, supers, attrs):
        print(name)

然后,您将看到根据需要打印
A
B

您的元类实际上不是
Meta
。如果您执行
类型(a)
,您将得到
,因为您覆盖了
Meta.\uuuuuuu新的
以返回普通的
类型,而不是
Meta
实例

一般来说,与普通类一样,对于元类,您希望覆盖
\uuu init\uuu
,并让
\uu new\uuu
执行默认操作

class Meta(type):
    def __init__(self, name, supers, attrs):
        print(name)

然后,您将看到根据需要打印
A
B

因为您返回
type(name,base,attrs)
您将得到类型为
type
的对象,而不是
Meta
。您可以通过打印
A.\uuuu class\uuu
来检查这一点。相反,您应该返回:

return super()

由于您返回
类型(名称、基数、属性)
您将得到类型为
类型的对象,而不是
元对象。您可以通过打印
A.\uuuu class\uuu
来检查这一点。相反,您应该返回:

return super()

AivanF.:另外,虽然没有错,但是基类的声明可以简化为
class A(metaclass=Meta):
。AivanF.:另外,虽然没有错,但是基类的声明可以简化为
class A(metaclass=Meta):