__init__ and arguments in Python
Solution 1
In Python:
-
Instance methods: require the
self
argument. - Class methods: take the class as a first argument.
-
Static methods: do not require either the instance (
self
) or the class (cls
) argument.
__init__
is a special function and without overriding __new__
it will always be given the instance of the class as its first argument.
An example using the builtin classmethod and staticmethod decorators:
import sys
class Num:
max = sys.maxint
def __init__(self,num):
self.n = num
def getn(self):
return self.n
@staticmethod
def getone():
return 1
@classmethod
def getmax(cls):
return cls.max
myObj = Num(3)
# with the appropriate decorator these should work fine
myObj.getone()
myObj.getmax()
myObj.getn()
That said, I would try to use @classmethod
/@staticmethod
sparingly. If you find yourself creating objects that consist of nothing but staticmethod
s the more pythonic thing to do would be to create a new module of related functions.
Solution 2
Every method needs to accept one argument: The instance itself (or the class if it is a static method).
Read more about classes in Python.
Solution 3
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.
Solution 4
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
Solution 5
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.
Yugo Kamo
Updated on May 12, 2021Comments
-
Yugo Kamo about 3 years
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?
-
ivanleoncz about 6 yearsI thought that there are some points of your answer, that deserves a little bit of highlight. I hope you don't mind about the improvements :)! Thanks for the answer!