Python 缺少 self 参数
Python is missing self argument
您好 :> 我正在学习 python 对象编程。我做了简单的代码:
import random
drawn = []
class Lottery():
def __init__(self, letter, drawn):
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.letter = letter
self.drawn = drawn
def drawnumbers():
number = random.randint(0, 10)
return number
def drawletters(self):
letter = random.choice(self.letters)
return letter()
for i in range(0,9):
drawn.append(drawnumbers())
for i in range(0,3):
drawn.append(drawletters())
print(drawn)
这是错误:
Traceback (most recent call last):
File "C:/Users/pawee/PycharmProjects/pythonProject1/lottery.py", line 3, in <module>
class Lottery():
File "C:/Users/pawee/PycharmProjects/pythonProject1/lottery.py", line 19, in Lottery
drawn.append(drawletters())
TypeError: drawletters() missing 1 required positional argument: 'self'
我做错了什么?
因此,当您定义属于 class 的方法时,它们都将 'self' 作为第一个参数。
定义 class 时也不要包含括号,除非它继承自另一个 class
但是,还有一些错误。
我认为这可能是格式错误,但最后几行需要取消缩进,因此它们在 class.
之外
如果它们应该是 class 的一部分,那么您需要将它们放在自己的方法中(也包括 self 参数)。
为了在没有实例的情况下调用彩票 class,它们也必须是静态的。
所以要达到 运行 需要让您的代码看起来像这样...
import random
drawn=[]
class Lottery: #no parenthesis
def __init__(self, letter, drawn):
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.letter = letter
self.drawn = drawn
@staticmethod
def drawnumbers(self): #include self
number = random.randint(0, 10)
return number
@staticmethod
def drawletters(self): #include self
letter = random.choice(self.letters)
return letter #no parenthesis
#unindent so we aren't in the class anymore
for i in range(0,9):
drawn.append(Lottery.drawnumbers())
for i in range(0,3):
drawn.append(Lottery.drawletters())
print(drawn)
#at this point, drawn is not associated with the lottery class
# to associate it, you need to make a variable out of the class
lotteryObj = Lottery("A", drawn) #it takes 2 arguments, letter and drawn
print(lotteryObj.drawn) #=> [...]
print(lotteryObj.letter) #=> "A"
然而,这并不是 classes 应该如何工作。
如果你想做彩票class,最好让class保存它使用的数据,并有影响该数据的方法。
这是默认参数派上用场的地方。它们允许您为 class 定义不需要给出的参数。
通过这种方式,您可以获得一些中奖号码的列表,将其提供给您的彩票 class,然后将其添加到列表中,再抽取 numbers/letters 个。
import random
drawn=[]
class Lottery: #no parenthesis
def __init__(self, drawn=[]): #default for drawn, letter not needed
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.drawn = drawn #if you don't give the class a list, it makes an empty list
def drawnumbers(self): #include self
number = random.randint(0, 10)
#instead of returning, change the list this class has using self
self.drawn.append(number)
def drawletters(self): #include self
letter = random.choice(self.letters)
self.drawn.append(letter)
#you can add a print method or get methods for printing or getting the drawn list
#unindent so we aren't in the class anymore
lotto1 = Lottery()
lotto2 = Lottery([1]) #give it a list with something in it
for i in range(0,9):
lotto1.drawnumbers()
lotto2.drawnumbers()
for i in range(0,3):
lotto1.drawletters()
lotto2.drawletters()
print(lotto1.drawn)
print(lotto2.drawn)
您好 :> 我正在学习 python 对象编程。我做了简单的代码:
import random
drawn = []
class Lottery():
def __init__(self, letter, drawn):
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.letter = letter
self.drawn = drawn
def drawnumbers():
number = random.randint(0, 10)
return number
def drawletters(self):
letter = random.choice(self.letters)
return letter()
for i in range(0,9):
drawn.append(drawnumbers())
for i in range(0,3):
drawn.append(drawletters())
print(drawn)
这是错误:
Traceback (most recent call last):
File "C:/Users/pawee/PycharmProjects/pythonProject1/lottery.py", line 3, in <module>
class Lottery():
File "C:/Users/pawee/PycharmProjects/pythonProject1/lottery.py", line 19, in Lottery
drawn.append(drawletters())
TypeError: drawletters() missing 1 required positional argument: 'self'
我做错了什么?
因此,当您定义属于 class 的方法时,它们都将 'self' 作为第一个参数。
定义 class 时也不要包含括号,除非它继承自另一个 class
但是,还有一些错误。
我认为这可能是格式错误,但最后几行需要取消缩进,因此它们在 class.
之外如果它们应该是 class 的一部分,那么您需要将它们放在自己的方法中(也包括 self 参数)。
为了在没有实例的情况下调用彩票 class,它们也必须是静态的。
所以要达到 运行 需要让您的代码看起来像这样...
import random
drawn=[]
class Lottery: #no parenthesis
def __init__(self, letter, drawn):
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.letter = letter
self.drawn = drawn
@staticmethod
def drawnumbers(self): #include self
number = random.randint(0, 10)
return number
@staticmethod
def drawletters(self): #include self
letter = random.choice(self.letters)
return letter #no parenthesis
#unindent so we aren't in the class anymore
for i in range(0,9):
drawn.append(Lottery.drawnumbers())
for i in range(0,3):
drawn.append(Lottery.drawletters())
print(drawn)
#at this point, drawn is not associated with the lottery class
# to associate it, you need to make a variable out of the class
lotteryObj = Lottery("A", drawn) #it takes 2 arguments, letter and drawn
print(lotteryObj.drawn) #=> [...]
print(lotteryObj.letter) #=> "A"
然而,这并不是 classes 应该如何工作。
如果你想做彩票class,最好让class保存它使用的数据,并有影响该数据的方法。
这是默认参数派上用场的地方。它们允许您为 class 定义不需要给出的参数。
通过这种方式,您可以获得一些中奖号码的列表,将其提供给您的彩票 class,然后将其添加到列表中,再抽取 numbers/letters 个。
import random
drawn=[]
class Lottery: #no parenthesis
def __init__(self, drawn=[]): #default for drawn, letter not needed
self.letters = ['a', 'b', 'c', 'd', 'f', 'g', 'h']
self.drawn = drawn #if you don't give the class a list, it makes an empty list
def drawnumbers(self): #include self
number = random.randint(0, 10)
#instead of returning, change the list this class has using self
self.drawn.append(number)
def drawletters(self): #include self
letter = random.choice(self.letters)
self.drawn.append(letter)
#you can add a print method or get methods for printing or getting the drawn list
#unindent so we aren't in the class anymore
lotto1 = Lottery()
lotto2 = Lottery([1]) #give it a list with something in it
for i in range(0,9):
lotto1.drawnumbers()
lotto2.drawnumbers()
for i in range(0,3):
lotto1.drawletters()
lotto2.drawletters()
print(lotto1.drawn)
print(lotto2.drawn)