我正在开展一个小项目,我不确定我得到的错误是由于我正在使用的IDLE还是我做错了。
我在Wing IDLE上运行的python中使用OOP。我在Windows 8 PC上运行了最新版本的python shell。
在我的程序中,我有一个方法,它接受用户输入并使用该输入创建创建一个架子所需的参数。
'def subject_creator(self):
subject_name = input("Enter the subject name:")
subject_file = subject_name + "file"
name = subject_name
return subject_name, subject_file, name'
理想情况下,程序将在打开新架子时使用三个返回的语句,即subject_name,subject_file和name。
'def __init__(self, subject_name, subject_file, name ):
subject_name = shelve.open ("subject_file", "c")
self.name = name
print("The", self.name ,"note has been created")'
while True:
print ("""
1.Create new note
2.Add new term
3.Look up term
4.Exit/Quit
""")
ans= input("What would you like to do?: ")
if ans=="1":
subject_creator()
note = Notebook(subject_name, subject_file, name)
subject_name.sync()
然而,当我运行程序并在我的主菜单中,我选择运行上面代码的选项1,我收到并发出错误。
<module>
builtins.TypeError: subject_creator() missing 1 required positional argument: 'self'
这有点令人费解,因为当我为主题创建者编写代码时我包含了self参数,如上所示。除此之外我没有其他错误。
非常感谢任何反馈。
答案 0 :(得分:1)
你混淆了“功能”和“方法”。
在Python中,方法是在class
范围内定义的函数,它将接收对象作为其隐含的第一个参数:
class Example:
def try_me(self):
print "hello."
您可以这样使用它:
x = Example()
x.try_me()
和try_me()
将收到x
作为其第一个(此处为忽略的)参数。这很有用,因此该方法可以访问对象实例的属性等。
将此与常规函数(即在class
之外定义的函数:
def try_me_too():
print "hello."
就像
一样被调用try_me_too()
从切面来看,您的示例代码未获取subject_creator
函数返回的值:
> if ans=="1":
> subject_creator()
> note = Notebook(subject_name, subject_file, name)
发生这种情况的范围没有名为subject_name
等的变量。您需要以某种方式创建它们。
if ans=="1":
ick, bar, poo = subject_creator()
note = Notebook(ick, bar, poo)
(我选择了无意义的变量名,主要是为了强调它们与定义的变量不同,只在subject_creator
内可用。)
为了完成此操作,这里演示self
如何有用。
class Otherexample:
def __init__(self, greeting):
self.greeting = greeting
def try_me_also(self):
print self.greeting
像这样使用:
y = Otherexample("hello.")
y.try_me_also()
这里,问候语是我们创建的对象的属性; __init__
方法将其作为参数接收,并将其存储为实例的属性。 try_me_also
方法使用self
来获取此属性,然后将其打印出来。
答案 1 :(得分:0)
此行会导致您的错误
subject_creator()
你应该改变
def subject_creator(self):
subject_name = input("Enter the subject name:")
subject_file = subject_name + "file"
name = subject_name
return subject_name, subject_file, name
到
def subject_creator():
subject_name = raw_input("Enter the subject name:")
subject_file = subject_name + "file"
name = subject_name
return subject_name, subject_file, name
如果你不能使用它,你就不需要在你的功能中使用参数。
另外,如果您使用的是python 2.x,请考虑使用raw_input()而不是input()。有关详细信息,请阅读differences between input() and raw_input()。