【问题标题】:Python OOP class method BookPython OOP 类方法书
【发布时间】:2022-11-19 02:07:07
【问题描述】:
Book.No_Pages() missing 2 required positional arguments: 'Words' and 'Font_size'
错误出现在第 14 行
代码是:-
class Book():
def __init__ (b1,Font_size=12,Words=300):
b1.Words = Words
pass
b1.Font_size = Font_size
pass
def No_Pages(b1,Words,Font_size):
return b1.Words/b1.Font_size
cyn_Book = Book(300,12)
print(cyn_Book.Font_size)
print(cyn_Book.Words)
print(cyn_Book.No_Pages())
我实际上通过另一种方法尝试了此操作,例如在 Font_size 和 Words 之后添加 pass 并认为它可以返回 words 300、Font_size 12 和 pages 为 15
【问题讨论】:
标签:
python
class
object
methods
【解决方案1】:
所以 No_pages 没有使用这些参数(Words 和 Font_size)——它是从 b1 参数(通常称为 self,顺便说一句。)获取它们。容器,b1,它从那里得到它需要的一切——但你也告诉它应该明确地交给它不需要的Words和Font_size。因为你没有通过它们,所以它失败了。
您可以通过将 def No_Pages(b1,Words,Font_size): 更改为 def No_Pages(b1): 来解决此问题
顺便问一下,你认为pass 会做什么?这实际上并没有做任何事情,它只是用作占位符,如果你有一段你还没有写的代码(并且需要在那里有一些东西)。例如,你可以这样做:
if some_condition:
pass
因为你还没有计算出你需要的语句,但是省略 pass 语句会使 python 失败,因为它期望某物到那里。
【解决方案2】:
为了约定,您需要将 self 参数添加到类方法,而不是使用 b1 引用实例。例如,您的__init__ 将变为
def __init__(self, Font_size=12, Words=300):
self.Words = Words
self.Font_size = Font_size
此外,您的 NoPages 函数需要 3 个参数,而您只提供一个参数,即 b1。因此错误Book.No_Pages() missing 2 required positional arguments: 'Words' and 'Font_size'
您可以将其重写为
def No_Pages(self):
return self.Words/self.Font_size
【解决方案3】:
将您的类定义更改为:
class Book:
def __init__ (self, font_size=12, words=300):
self.font_size = font_size
self.words = words
def no_pages(self):
return self.words / self.font_size
当你定义一个像no_pages这样的函数时,你会说出它期望的参数。如果你这样定义它:
def No_Pages(b1,Words,Font_size):
然后它需要三个参数:b1(对象本身,当您调用实例方法时自动提供,通常称为self)、Words和Font_size。由于该函数需要 Words 和 Font_size 参数,如果您在没有它们的情况下调用它,它将引发错误。不过,您根本不需要将这些参数作为此函数的一部分,因为 self 已经包含它们。
添加 pass 没有任何作用;你只在需要一段代码的情况下使用pass关键字(例如在except的主体中)但你实际上不想执行任何东西。
如果您使用 @dataclass,您可以进一步简化您的类,它会根据类的属性为您构建构造函数:
from dataclasses import dataclass
@dataclass
class Book:
font_size: int = 12
words: int = 300
def no_pages(self):
return self.words / self.font_size