【问题标题】:__init__() missing 4 required positional arguments__init__() 缺少 4 个必需的位置参数
【发布时间】:2021-03-12 10:42:23
【问题描述】:

我已创建此代码,但我不断收到错误:TypeError: init() 缺少 4 个必需的位置参数:'x'、'y'、'r' 和 'color' .任何想法?请

下面是我的代码:

import math
    
    class objeto:
        def __init__(self,x, y, r, color):
            self.x = x
            self.y = y
            self.r = r
            self.color = color
            
        def colicionEntre(self,pelota):
            distancia = math.sqrt(pow(self.x-pelota.x,2)+pow(self.y-pelota.y,2))
            radios = self.r + pelota.r
            cad = "La pelota " + self.color + " y la pelota " + pelota.color
            if(distancia<radios):
                cad = cad + " si colicionan"
            else:
                cad = cad + " no colicionan"
            return cad
    
        def procesarLista(self,listaPelotas):
            for i in range(len(listaPelotas)):
                for x in range(i,len(listaPelotas)):
                    if(listaPelotas[i]!=listaPelotas[x]):
                        print(listaPelotas[i].colicionEntre(listaPelotas[x]))
                        
    pelota = objeto(3,4,2,"Amarilla")
    pelota2 = objeto(5,5,1,"Verde")
    pelota3 = objeto(2,2,1,"Roja")
    pelota4 = objeto(1,1,1,"Azul")
    lista = [pelota,pelota2,pelota3,pelota4]
    objetoObj = objeto()
    objetoObj.procesarLista(lista)

【问题讨论】:

  • objetoObj = objeto() 正在创建该类的对象,但是您的 __init__() 需要 4 个元素,而您没有提供任何元素。

标签: python python-3.x


【解决方案1】:
class objeto:
    def __init__(self,x, y, r, color):

你的类有 4 个参数,但是当你调用它时:

objetoObj = objeto()

你没有给它任何论据。尝试输入参数(可能是None

【讨论】:

    【解决方案2】:

    你的错误的核心问题是你试图创建一个需要 4 个位置参数的对象,而你没有提供。

    objetoObj = objeto()
    

    根据您的代码以及您似乎打算实现的目标,您应该将函数 procesarLista 移出类。

    完成此操作后,您可以将对象列表传递给您的函数,无需删除 self,您的函数将按照您编写的方式运行。

    import math
        
    class objeto:
        def __init__(self,x, y, r, color):
            self.x = x
            self.y = y
            self.r = r
            self.color = color
            
        def colicionEntre(self,pelota):
            distancia = math.sqrt(pow(self.x-pelota.x,2)+pow(self.y-pelota.y,2))
            radios = self.r + pelota.r
            cad = "La pelota " + self.color + " y la pelota " + pelota.color
            if(distancia<radios):
                cad = cad + " si colicionan"
            else:
                cad = cad + " no colicionan"
            return cad
    
    def procesarLista(listaPelotas):
        for i in range(len(listaPelotas)):
            for x in range(i,len(listaPelotas)):
                if(listaPelotas[i]!=listaPelotas[x]):
                    print(listaPelotas[i].colicionEntre(listaPelotas[x]))
                        
    pelota = objeto(3,4,2,"Amarilla")
    pelota2 = objeto(5,5,1,"Verde")
    pelota3 = objeto(2,2,1,"Roja")
    pelota4 = objeto(1,1,1,"Azul")
    lista = [pelota,pelota2,pelota3,pelota4]
    
    procesarLista(lista)
    

    输出


    La pelota Amarilla y la pelota Verde si colicionan
    La pelota Amarilla y la pelota Roja si colicionan
    La pelota Amarilla y la pelota Azul no colicionan
    La pelota Verde y la pelota Roja no colicionan
    La pelota Verde y la pelota Azul no colicionan
    La pelota Roja y la pelota Azul si colicionan
    >>> 
    

    【讨论】:

    • 另一种选择是将 procesarLista 定义为静态方法,然后使用 objecto.procesarList(lista) 调用它。请注意,静态方法没有 self 参数。静态方法是通过用 @staticmethod 装饰它们来创建的
    • @LhasaDad 鉴于 OP 的意图,处理多个对象。我相信你最好不要仅仅为了处理你已经创建的对象而创建一个新对象。甚至可能编写一个函数并将其传递给要处理的对象列表。
    • 我的第一个回复中有错字。当我提到类名 objeto 时,我说 objecto。 objeto.procesarLista(xxxx) 将调用静态方法而无需创建对象。它的行为方式与您建议的方式相同,但它将方法命名为与类关联。很抱歉有任何混淆。
    【解决方案3】:

    除了其他人提到的关于你的对象的主要问题之外,你可以简化你的 procesarLista() 方法并去掉条件语句,如下所示:

    def procesarLista(self, listaPelotas):
        for i in range(len(listaPelotas)):
            for x in range(i+1, len(listaPelotas)):
                    print(listaPelotas[i].colicionEntre(listaPelotas[x]))
    
    #output:
    La pelota Amarilla y la pelota Verde si colicionan
    La pelota Amarilla y la pelota Roja si colicionan
    La pelota Amarilla y la pelota Azul no colicionan
    La pelota Verde y la pelota Roja no colicionan
    La pelota Verde y la pelota Azul no colicionan
    La pelota Roja y la pelota Azul si colicionan
    

    【讨论】:

    • 这不是回答原始问题。虽然这是真的,但它没有回答所提出的问题。
    • @LhasaDad 这就是为什么我开始回答时承认其他人已经解决了主要问题。这是其他人没有提出的代码的另一个问题,所以我认为这会有所帮助。事实上,OP 确实觉得它很有帮助并点赞了它。
    猜你喜欢
    • 2021-02-08
    • 2019-02-08
    • 1970-01-01
    • 2019-06-25
    • 2020-06-13
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多