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