自我参数有问题

时间:2014-04-24 02:14:43

标签: python oop

我正在开展一个小项目,我不确定我得到的错误是由于我正在使用的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参数,如上所示。除此之外我没有其他错误。

非常感谢任何反馈。

2 个答案:

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