这一段代码为什么会报错,求解
Topic sourceimport random
class Fish():
def __init__(self,x,y):
self.x=random.randint(0,10)
self.y=random.randint(0,10)
d=Fish()
print(d.x)
我觉得是因为x、y两个参数没有传入并且没有默认值导致的,不知道对不对。我试了以下三种都能正常运行
1、传入参数:
import randomclass Fish(object): def __init__(self, x, y): self.x = random.randint(0, 10) self.y = random.randint(0, 10)d = Fish(1, 2)print(d.x)
2、不传入参数:
import randomclass Fish(): def __init__(self): self.x = random.randint(0, 10) self.y = random.randint(0, 10)d = Fish()print(d.x)
3、有默认值参数:
import randomclass Fish(): def __init__(self, x=1, y=2): self.x = random.randint(0, 10) self.y = random.randint(0, 10)d = Fish()print(d.x)
因为你把x和y放在def __init__后面的括号里,这时候它就相当于函数的一个形参
用你定义的这个class为例,如果我运行
exp = Fish(a,b)
这时exp有两个属性:a和b
如果只写了def __init__(self),这时所有的用这个类创建的对象都有两个属性x和y,并且有随机值
TypeError: __init__() missing 2 required positional arguments: 'x' and 'y'# 1)__init__()中的两个形参跟类属性的名称相同,容易误导!# 2)正确的常规的做法是形参传递给类的属性,例如 self.x=xx
#%% 规范的设计与调用应该是这样的:import randomclass Fish(): def __init__(self,xx,yy): self.x=xx+random.randint(0,10) self.y=yy+random.randint(0,10)d = Fish(1, 2)print(d.x)
首先,你在定义类的是否Fish
后面()
没有写object.
其次,验证了一下,修正后代码是可以运行的,只不过Fish()
必须给两个参数,不然会报错。不当然,因为在__init__(self, x, y)
中的随机数函数把输入的参数覆盖掉了,打印出来的x,y的值是随机的。
import random
class Fish(object):
def __init__(self,x,y):
self.x=random.randint(0,10)
self.y=random.randint(0,10)
def print_xy(self):
print('x=%d y=%d' % (self.x, self.y))
mynum = Fish(1,2) #x,y给的参数是1,2;而输出的结果是4,5
mynum.print_xy()
x=4 y=5
mynum = Fish() #没给参数,报错了
Traceback (most recent call last):
File "C:\Users\asj\AppData\Local\Programs\Python\Python310\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
TypeError: Fish.__init__() missing 2 required positional arguments: 'x' and 'y'
- 1
用户6682382629
import random
class Fish():
def __init__(self,x,y):
self.x=random.randint(0,10)
self.y=random.randint(0,10)