Python 3 运行时错误:super():无参数

问题描述 投票:0回答:4

为什么我会收到此错误?

super().display()  
 RuntimeError: super(): no arguments

我尝试在

Project
中调用类
Progress.display()
的显示函数如何显示用户的输入?这是代码:

class Project:
    def __init__(self, name="", job="", **kwargs):
        super().__init__(**kwargs)
        self.name = name
        self.job = job

    def display():
        print("name: ", (self.name))
        print("job: ", (self.job))

    @staticmethod
    def prompt_init():
        return dict(name=input("name: "), job=input("job: "))


class Stages(Project):
    def __init__(self, stages="", **kwargs):
        super().__init__(**kwargs)
        self.stages = stages

    def display(self):
        super().display()
        print("stages: ", (self.stages))

    @staticmethod
    def prompt_init():
        parent_init = Project.prompt_init()

        choice = None
        while choice not in (1, 2, 3, 4, 5, 6):

            print("Insert your stage now: ")
            print("1. Planning")
            print("2. Analysis")
            print("3. Design")
            print("4. Implementation")
            print("5. Testing")
            print("6. Release")

            choice = input("enter your choice: ")
            choice = int(choice)

            if choice == 1:
                stages = "Planning"
            elif choice == 2:
                stages = "Analysis"
            elif choice == 3:
                stages = "Design"
            elif choice == 4:
                stages = "Implementation"
            elif choice == 5:
                stages = "Testing"
            elif choice == 6:
                stages = "Release"
            else:
                print("no such input, please try again")

            print(name)
            print(stages)


class Progress(Project):
    def __init__(self, progress="", **kwargs):
        super().__init__(**kwargs)
        self.progress = progress

    def display(self):
        super().display()
        print("progress: ", (self.progress))

    @staticmethod
    def prompt_init():
        parent_init = Project.prompt_init()

        choice = None
        while choice not in (1, 2, 3, 4):

            print("1. 25%")
            print("2. 50%")
            print("3. 75%")
            print("4. 100%")

            choice = input("enter your choice[1-4]: ")
            choice = int(choice)

            if choice == 1:
                progress = "25%"
            elif choice == 2:
                progress = "50%"
            elif choice == 3:
                progress = "75%"
            elif choice == 4:
                progress = "100%"
            else:
                print("no such input, please try again")

            print(progress)
        parent_init.update({"progress": progress})
        return parent_init


class A(Stages, Progress):
    def prompt_init():
        init = Stages.prompt_init()
        init.update(Progress.prompt_init())
        return init

    prompt_init = staticmethod(prompt_init)


class New:
    type_map = {("stages", "progress"): A}

    def add_project_test(self, name, job, stages):
        init_args = Project.prompt_init()
        self.project_list.append(Project(**init_args))

    def __init__(self):
        self.project_list = []

    def display_project():
        for project in self.project_list:
            project.display()
            print()

    def add_progress(self):
        init_args = Progress.prompt_init()
        self.project_list.append(Progress(**init_args))

    def add_project(self):
        ProjectClass = self.type_map[A]
        init_args = ProjectClass.prompt_init()
        self.property_list.append(ProjectClass(**init_args))


my_list = New()
my_list.add_progress()
my_list.display_project()
python python-3.x super
4个回答
44
投票

不是100%解决问题,但同样的错误。怀着对与我有同样问题的 Google 员工的热爱而发帖。

使用 Python 3,我收到此错误,因为我忘记在方法中包含

self
。简单的事情,但有时最简单的事情会让你在累的时候绊倒。

class foo(object):
    def bar(*args):
        super().bar(*args)

=>

RuntimeError: super(): no arguments

记得附上您的

self

class foo(object):
    def bar(self, *args):
        super().bar(*args)

42
投票

并不是这个问题的真正答案,但是当我在 pdb shell 中尝试调用

super
时遇到了同样的错误,并最终陷入了兔子洞试图找出答案。您需要将要调用 super 和 self 的父类添加到调用中,以便它在 pdb 中运行 -
super(<ParentClass>, self)
。或者至少知道
super
在 pdb 中不会按预期工作。我并不是真的需要在那里调用它,但它阻止了我弄清楚为什么其他东西不起作用。


31
投票

每次在方法中使用 super() 时,都需要在实例方法或类方法中。你的

staticmethod
不知道他们的超类是什么。观察:

class Funky:
    def groove(self):
        print("Smooth")

    @staticmethod
    def fail():
        print("Ouch!")

    @classmethod
    def wail(cls):
        print("Whee!")


class Donkey(Funky):
    def groove(self):
        print(super())

    @staticmethod
    def fail():
        try:
            print(super())
        except RuntimeError as e:
            print("Oh no! There was a problem with super!")
            print(e)

    @classmethod
    def wail(cls):
        print(super())


a_donkey = Donkey()
a_donkey.groove()
a_donkey.fail()
a_donkey.wail()

输出:

<super: <class 'Donkey'>, <Donkey object>>
Oh no! There was a problem with super!
super(): no arguments
<super: <class 'Donkey'>, <Donkey object>>

这是您的代码,经过调试并带有一些额外的功能和测试:

class Project:
    def __init__(self, name="", job="", **kwargs):
        super().__init__(**kwargs)
        self.name = name
        self.job = job

    def display(self):
        print("name: ", self.name)
        print("job: ", self.job)

    @staticmethod
    def prompt_init():
        return dict(name=input("name: "), job=input("job: "))


class Progress(Project):
    def __init__(self, progress="", **kwargs):
        super().__init__(**kwargs)
        self.progress = progress

    def display(self):
        super().display()
        print("progress: ", self.progress)

    @staticmethod
    def prompt_init():
        parent_init = Project.prompt_init()
        progress = input("your progress: ")
        parent_init.update({
            "progress": progress
        })
        return parent_init


class New:
    def __init__(self):
        self.project_list = []

    def display_project(self):
        for project in self.project_list:
            project.display()
            print()

    def add_project(self):
        init_args = Project.prompt_init()
        self.project_list.append(Project(**init_args))

    def add_progress(self):
        init_args = Progress.prompt_init()
        self.project_list.append(Progress(**init_args))


my_list = New()
my_list.add_project()
my_list.add_progress()
my_list.display_project()

2
投票

您可能根本不需要使用

super()
,只需直接引用超类即可。例如,我正在编写一个像 this one 这样的 Django 测试,但在我的例子中
AnimalTestCase
继承了
ParentTestCase
。我希望 AnimalTestCase 中的
fixture
属性使用
ParentTestCase
中的所有相同装置,并添加更多。但打电话
super()
从来没有成功。最后,我意识到我可以照原样引用
ParentTestCase

fixtures = ParentTestCase.fixtures + ['more']

class ParentTestCase(TestCase):
    fixtures = ['bacteria', 'fungus', 'stalagtites', 'stalagmites']

    def setUp(self):
        # Test definitions as before.
        call_setup_methods()


class AnimalTestCase(ParentTestCase):
    fixtures = ParentTestCase.fixtures + ['vertebrata', 'invertebrate']

    def test_fluffy_animals(self):
        # A test that uses the fixtures.
        call_some_test_code()
© www.soinside.com 2019 - 2024. All rights reserved.