python 3 error RuntimeError:super():没有参数

时间:2018-11-27 21:53:25

标签: python python-3.x

为什么会出现此错误?有人可以为我解决这个问题吗?我试图从Progress.display()的类项目中调用显示函数,或者有人对如何显示用户输入有其他解决方案?

我如何同时输入Stages类和Progress类?谢谢你的帮助

  

super()。display()    RuntimeError:super():无参数

这是代码

    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()

4 个答案:

答案 0 :(得分:7)

每次在方法中使用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()

答案 1 :(得分:3)

不是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)

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可能根本不必使用 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()