Randomblue
Randomblue

Reputation: 116383

Python TypeError regarding arguments

This is my code:

class bla:
    def function1():
        print 1
    def function2():
        bla.function1()

x = bla()

x.function2()

I don't understand why I get the error "TypeError: function2() takes no arguments (1 given)" as I don't seem to be passing any argument to function2.

Upvotes: 0

Views: 299

Answers (4)

Chris
Chris

Reputation: 46356

You have to pass the argument self to the functions function1 and function2. See the Python Classes documentation. So your code would be

class Bla: # Notice capitalization. 
    def function1(self):
        print 1
    def function2(self):
        bla.function1()

x = Bla()

x.function2()

See also the answers to the question Why do you need explicitly have the “self” argument into a Python method?.

Basically in Python a call to a member function (like function1)

x = Bla()
x.function1()

is translated into

Bla.function(x)

self is used to refer to the instance of the class x.

Upvotes: 0

Useless
Useless

Reputation: 67802

Regular methods are called with an implicit self reference to their object - otherwise they wouldn't be able to access any data members of x.

They should always be declared like so:

class bla:
    def function1(self):
        print 1

if you want them to operate on the object (self is loosely equivalent to the this pointer in C++, for example).

Alternatively, if you don't care about the object (so you're really just using the class to group some functions together), you can make them static like so:

class bla:
    @staticmethod
    def function1():
        print 1

    @staticmethod
    def function2():
        bla.function1()

In fact, that's the only way you can call bla.function1() without an instance of bla from your function2.

Upvotes: 6

soulcheck
soulcheck

Reputation: 36777

That's cause your calling your function as a method and that automatically binds the method's object as the first argument to your function.

Either do:

bla.function2() #a function call

or:

class bla:
    #normal and correct way to define class methods - first argument is the object on which the method was called
    def function1(self):
        print 1
    def function2(self):
        self.function1()

Upvotes: 1

Constantinius
Constantinius

Reputation: 35069

You have to type:

class bla:
    def function1(self):
        print 1
    def function2(self):
        self.function1()

self (a reference to the object on which the method is called) is passed as the first parameter to each method. The name of this first variable, "self" is just a common convention.

Upvotes: 0

Related Questions