python-3.x - 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 技能,所以我的一般编程知识仍然有限。如果您有任何资料可以很好地解释它或对您有帮助,我会很高兴阅读它们。
提前致谢!
解决方案
该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 年左右没有使用过。
推荐阅读
- python - python 3 - getpass.getpass() 正在回显密码......似乎没有任何效果
- git - Git - 在 Windows 上克隆本地存储库
- javascript - 将 Json 对象转换为 html
- angular - 如何在 Angular 中转换 ControlValueAccessor 的值?
- git - 在 GitHub 中更改分支后创建新版本
- c++ - 按边长递归搜索图中所有可行路径
- javascript - 调试时更新比发布版本慢
- flutter - 如何使我的 Flutter 应用程序也可以作为模块应用程序工作?
- c# - 如何使用 Join 与实体框架 Lambda 和 Linq 在两个或多个表中进行搜索
- css - CSS 为什么宽度不对?