Discuss / Python / 这一段代码为什么会报错,求解

这一段代码为什么会报错,求解

Topic source

import random 

class Fish():

    def __init__(self,x,y):

        self.x=random.randint(0,10)

        self.y=random.randint(0,10)

import 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)

0oHalaXxo0

#3 Created at ... [Delete] [Delete and Lock User]

我觉得是因为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)

Ethann

#6 Created at ... [Delete] [Delete and Lock User]

首先,你在定义类的是否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'

我感觉兄弟你的想法是创建fish类,然后方便的给每个fish实例创建随机的x,y属性。我想了一下发现好像如果按照你的写法,还是得在创建实例的时候填写参数,然后得出的结果又和参数没啥关系。所以估计得再定义一个方法才能实现

class Fish(object):

    def __init__(self):

        pass

    def random_xy(self):

        self.x = random.randint(0,10)

        self.y = random.randint(0,10)

a = Fish()

a.random_xy()

print(a.x,a.y)

期待更好的答案

或者直接定义类属性,哈哈哈学到后面的时候想起来

class Fish(object):

    x = random.randint(0,10)

    y = random.randint(0,10)

    def __init__(self):

        pass

    def random_xy(self):

        pass

a = Fish()

print(a.x,a.y)

试试这个。

import random
class Fish:
    x = random.randint(0, 10)
    y = random.randint(0, 10)

d = Fish()
print(d.x, d.y)

  • 1

Reply