繁体   English   中英

A Python Inheritance 问题:TypeError:super() 参数 1 必须是类型,而不是无

[英]A Python Inheritance Problem: TypeError: super() argument 1 must be type, not None

我想使用装饰器将 class 名称和 class 本身保存到 python 字典中。

from functools import wraps
models = {} # python dict which save class name and class

def register_model(name):
    def register(func):
        @wraps(func)
        def inner(name):
            models[name] = func

        return inner(name)

    return register

# `A` is a class that I want to save into the dict.

@register_model('1244')
class A(object):
    a = 1

    def __init__(self):
        super(A, self).__init__()

# But when call it below:

print(models['1244']().a)

我收到一个错误:

Traceback (most recent call last):
  File "/Data/Usr/t.py", line 50, in <module>
    print(models['1244']().a)
  File "/Data/Usr/t.py", line 36, in __init__
    super(A, self).__init__()
TypeError: super() argument 1 must be type, not None

我通过将super(A, self).__init__()更改为super().__init__() __() 来解决此错误

我想知道为什么 augment 1 是 None 以及是什么原因造成的。

装饰器不返回任何东西,它返回的任何东西都将分配给名称A (class 定义)。 您正在使 class 只能通过models['1244']访问,因此A()不起作用(因为ANone )。 这就是你做super(A, ...)时发生的事情。

  1. 您不需要将A传递给super ,只需super().__init__()就可以了。 这将解决这个特定问题。
  2. 您的装饰器应返回 class。

实际上,您的装饰器过于复杂。 inner完全是多余的。 将其更改为此以解决这两个问题:

def register_model(name):
    def register(cls):
        models[name] = cls
        return cls

    return register

现在它只是在models中注册 class,否则让它通过不变。

您的装饰器返回None ,因此原始 scope 中的A最终为None ,而带有A = Nonesuper(A, self)是无效调用。 简单的解决方法是从装饰器return func

简化您的代码并摆脱过时的习惯用法,例如从objectsuper(..., ...)继承,一切正常:

models = {}


def register_model(name):
    def register(cls):
        models[name] = cls
        return cls

    return register


@register_model('1244')
class A:
    a = 1

    def __init__(self):
        super().__init__()
        print("Hi!")


print(models['1244']().a)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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