为什么会出现此错误?有人可以为我解决这个问题吗?我试图从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()
答案 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()