首页 > 解决方案 > method() 缺少 1 个必需参数:'self',而 method() 不需要任何参数

问题描述

因此,为了学习 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 技能,所以我的一般编程知识仍然有限。如果您有任何资料可以很好地解释它或对您有帮助,我会很高兴阅读它们。

提前致谢!

标签: python-3.xclassoop

解决方案


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__方法,该方法为我们的特定书籍设置author和的值。title

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 中的一两个错字,在过去 5 年左右没有使用过。


推荐阅读