method()缺少1个必需参数:'self',而method()不需要任何参数

时间:2019-01-07 06:51:19

标签: python-3.x class oop

因此,为了学习OOP编程,我们在构建类中担负任务。这些类应允许我们通过终端获取input()。像“输入'a'”一样获得所有书籍的清单。

这是我的第一种方法,它不起作用。它应该不带任何参数,也不需要任何参数,因为有一个列表要读取。

所以我的代码如下:

from Library import *

while(True):

print("blabla explaining how to use the program, do you want to 'a', print a list of all books, 'b'.....")
user_choice = input

if(user_choice == 'a'):
    Library.list_books()
if(user_choice == 'b'):
    #etc. 

库方法如下:

from Book import *

def list_books(self):
    for Book.Book in Book.book_list:
        print(Book.Book.name)

如您所见,它实际上并不需要任何功能。那么为什么要一个参数呢。显然,如果我删除“自我”将起作用,但是据我所知,这不是常规的。我发现的唯一解决方法是添加@classmethod。我的老板虽然不赞成,但称其为作弊。

可能是,我还没有完全了解“自我”的作用,但就目前而言,我所知道的是,它不起作用,而且我没有想法。我仍在研究它,但要么我太愚蠢,要么是资料来源没有很好地向我解释它。我刚刚进行Python编程已有2周之久,并且具有非常熟练的Java技能,所以我的一般编程知识仍然很有限。如果您有任何资料可以很好地解释它或对您有帮助,我将很高兴阅读它们。

谢谢!

1 个答案:

答案 0 :(得分:1)

self参数通常由IDE自动添加到方法中。它主要在方法包含在类内部时使用。

例如下面的Book类。

class Book:
    author = ""
    title = ""

    def __init__(self, author, title):
        self.author = author
        self.title = title

    def print_book_information(self):
        print("'%s' by %s" % (self.title, self.author))

由于您只是从OOP入手,因此很多事情都会让人感到困惑。首先,我们声明类类型Book。

class Book:

接下来的两行声明与Book类关联的变量。在这种情况下,我们要存储书籍的author和书籍的title

    author = ""
    title = ""

如果您注意到,接下来的两个函数都有一个self参数。参数self引用您所创建的书。所以如果我像这样创作一本书:

my_book = Book('Ayn Rand', 'Atlas Shrugged')

它将执行__init__方法,该方法将为我们的特定书籍设置authortitle的值。

self.author = author # Sets our author to be 'Ayn Rand'
self.title = title   # Sets our title to be 'Atlas Shrugged'

现在我们的班级完成了,我们可以做类似

的事情
>>> my_book.print_book_information()
'Atlas Shrugged' by Ayn Rand

方法print_book_information中的通知我们如何使用单词self来引用我们的作者和标题? self本质上允许该方法知道您正在看哪本特定的书。否则,该方法将不知道您要哪一本书的书名或作者。

此外,在您提到的问题中,您具有非常温和的Java背景。 self执行与Java中的this关键字类似的功能,不同之处在于您必须将其作为Python中的参数包括在内,而不必在Java中的参数中对其进行引用。以下两种方法基本相同:

# Python
class Hello:
    def say_hello(self):
        print("Hello!")

// Java
public class Hello
{
    public void say_hello()
    {
        System.out.println("Hello!");
    }
}

在Java中可能是一两个拼写错误,在过去的五年左右的时间里没有使用过。