Beta
Beta

Reputation: 1736

Error while defining the class

I'm new to "class" in python. I created a following class in python. The objective of this class is, if pass a list of numbers, if the sum of 2 numbers is 50, it will return me the position of those number in the list.

from itertools import  combinations
class numList(object):

    def findComb(self):
        a = []
        b = []
        for comb in combinations(self, 2):
            a.append(comb)
        for i in range(1, len(a)):
            if sum(a[i]) == 50:
                b.append(a[i])
        return b

c = numList()
c.findComb([10,20,10,40,50,60,70])

But I'm getting the following error, when I'm trying to execute it:

TypeError: findComb() takes 1 positional argument but 2 were given

Please let me know where I'm making the mistake.

Thank you!

Upvotes: 0

Views: 48

Answers (2)

FLab
FLab

Reputation: 7466

Each method within a class takes as positional input the instance of the class itself, unless you add the @staticmethod decorator.

So you are receiving the error because the function findComb receives as input:

  1. the instance (by default)
  2. the list you passed

This should clarify the error you are receiving.

You can fix it in two ways:

Assigning the input list to an attribute of the class and then use the attribute in the function:

class numList(object):

    def __init__(self, inp_list):
        self.input = inp_list

    def findComb(self):
        a = []
        b = []
        for comb in combinations(self.input, 2):
            a.append(comb)
        for i in range(1, len(a)):
            if sum(a[i]) == 50:
                b.append(a[i])
        return b

c = numList([10,20,10,40,50,60,70])
c.findComb()

Define findComb as a staticmethod, so that it would only use the argument you are passing (without using the instance as first argument):

class numList(object):

    @staticmethod
    def findComb(inp_list):
        a = []
        b = []
        for comb in combinations(inp_list, 2):
            a.append(comb)
        for i in range(1, len(a)):
            if sum(a[i]) == 50:
                b.append(a[i])
        return b

c = numList()
c.findComb([10,20,10,40,50,60,70])

Upvotes: 1

ILostMySpoon
ILostMySpoon

Reputation: 2409

By design, the first argument of every class function is always a reference to the current instance of the class (always named self).

You are calling findComb with an additional argument when you defined it to only take one (self).

def findComb(self):
    ...

should be

def findComb(self, myList):
    ...

All your references to self in your function implementation will need to be updated accordingly to use myList.

Upvotes: 1

Related Questions