I want to understand arguments of the constructor __init__
in Python.
class Num:
def __init__(self,num):
self.n = num
def getn(self):
return self.n
def getone():
return 1
myObj = Num(3)
print myObj.getn()
RESULT: 3
I call the getone()
method:
print myObj.getone()
RESULT: Error 'getone()' takes no arguments (1given).
So I replace:
def getone():
return 1
with
def getone(self):
return 1
RESULT:1 This is OK.
But getone()
method needs no arguments.
Do I have to use meaningless argument?
In python you must always pass in at least one argument to class methods, the argument is self
and it is not meaningless its a reference to the instance itself
If you print(type(Num.getone))
you will get <class 'function'>
.
It is just a plain function, and be called as usual (with no arguments):
Num.getone() # returns 1 as expected
but if you print print(type(myObj.getone))
you will get <class 'method'>
.
So when you call getone()
from an instance of the class, Python automatically "transforms" the function defined in a class into a method.
An instance method requires the first argument to be the instance object. You can think myObj.getone()
as syntactic sugar for
Num.getone(myObj) # this explains the Error 'getone()' takes no arguments (1 given).
For example:
class Num:
def __init__(self,num):
self.n = num
def getid(self):
return id(self)
myObj=Num(3)
Now if you
print(id(myObj) == myObj.getid())
# returns True
As you can see self
and myObj
are the same object
The current object is explicitly passed to the method as the first parameter. self
is the conventional name. You can call it anything you want but it is strongly advised that you stick with this convention to avoid confusion.
The fact that your method does not use the self
argument (which is a reference to the instance that the method is attached to) doesn't mean you can leave it out. It always has to be there, because Python is always going to try to pass it in.
Every method needs to accept one argument: The instance itself (or the class if it is a static method).
Source: Stackoverflow.com