What do __init__ and self do in Python? [duplicate]
Asked Answered
K

18

972

I'm learning the Python programming language and I've came across something I don't fully understand.

In a method like:

def method(self, blah):
    def __init__(?):
        ....
    ....

What does self do? What is it meant to be? Is it mandatory?

What does the __init__ method do? Why is it necessary? (etc.)

I think they might be OOP constructs, but I don't know very much.

Kwangchowan answered 9/3, 2009 at 5:9 Comment(2)
I know this has over a million views, but it's still fundamentally a bad question that should have been closed at the start. There are fundamentally two unrelated questions, both of which are separately addressed with good quality QA pairs. Granted this is older than both, but. Not to mention, the code example provided is nonsensical, and that's after editors guessed at the intended formatting. Plus the entire text of the question is just... confused.Peyton
See also: #1389680Extricate
P
706

In this code:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... the self variable represents the instance of the object itself. Most object-oriented languages pass this as a hidden parameter to the methods defined on an object; Python does not. You have to declare it explicitly. When you create an instance of the A class and call its methods, it will be passed automatically, as in ...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

The __init__ method is roughly what represents a constructor in Python. When you call A() Python creates an object for you, and passes it as the first parameter to the __init__ method. Any additional parameters (e.g., A(24, 'Hello')) will also get passed as arguments--in this case causing an exception to be raised, since the constructor isn't expecting them.

Per answered 9/3, 2009 at 5:18 Comment(8)
what if you put x = 'Hello' outside init but inside the class? is it like java where it's the same, or does it become like a static variable which is only initialised once?Weighted
It's like a static variable. It's only initialized once, and it's available through A.x or a.x. Note that overriding it on a specific class will not affect the base, so A.x = 'foo'; a.x = 'bar'; print a.x; print A.x will print bar then fooPer
It's worth pointing out that the first argument need not necessarily be called self, it just is by convention.Selmner
@u449355 See here #4015917 for a reason to use object in class A.Deft
What's the point of object in the class declaration? I've noticed some classes have this and some don'tQuickman
@Quickman It's for Python 2 compatibility. In Python 3 there is no need to explicitly inherit from object because it happens by default.Maronite
is self like a context?Barbwire
@CoolorFool-SRS sorta. It is the instance that the method is being called on. So, conceptually (how it actually works is a bit different) you can think of like this, for some_instance that is of SomeClass, the expression some_instance.some_method() is equivalent to SomeClass.some_method(some_instance)Lavinialavinie
S
314

Yep, you are right, these are oop constructs.

__init__ is the constructor for a class. The self parameter refers to the instance of the object (like this in C++).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

The __init__ method gets called after memory for the object is allocated:

x = Point(1,2)

It is important to use the self parameter inside an object's method if you want to persist the value with the object. If, for instance, you implement the __init__ method like this:

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

Your x and y parameters would be stored in variables on the stack and would be discarded when the init method goes out of scope. Setting those variables as self._x and self._y sets those variables as members of the Point object (accessible for the lifetime of the object).

N.B. Some clarification of the use of the word "constructor" in this answer. Technically the responsibilities of a "constructor" are split over two methods in Python. Those methods are __new__ (responsible for allocating memory) and __init__ (as discussed here, responsible for initialising the newly created instance).

Stickney answered 9/3, 2009 at 5:18 Comment(5)
So then is there any reason why you wouldn't want self to be in the constructor? Why do you even have to specify it, wouldn't it be better if it was implicit?Magbie
As far I know, __ init __ is not a constructor, it is the first method which will be executed when any object is created, __ init __ is used to setup object. __ new __ is the constructor in python.Whitley
For those who read this answer, it is completely wrong. __init__ does not allocate space in memory. It is expected to initialize instance attributes. What allocates in memory is __new__.Grainfield
@Grainfield The text of the answer is actually "The init method gets called when memory for the object is allocated". It doesn't say init allocates memory, it says it is called when memory is allocated. Perhaps worth clarifying by changing "when" to "after" :)Stickney
@AaronFranke: Per The Zen of Python (run import this in an interactive interpreter), "Explicit is better than implicit". In this case, there are some benefits to allowing this: 1) Methods are just functions that happen defined in a class, and need to be callable either as bound methods with implicit self passing or as plain functions with explicit self passing. 2) Making classmethods and staticmethods means you want to be able to rename and omit self respectively. 3) Functions are allowed to be attached to classes after class definition, so you can't change behavior contextually.Escheat
H
283

A brief illustrative example

In the hope it might help a little, here's a simple example I used to understand the difference between a variable declared inside a class, and a variable declared inside an __init__ function:

class MyClass(object):
    i = 123
    def __init__(self):
        self.i = 345
     
a = MyClass()
print(a.i)
print(MyClass.i)

Output:

345
123
Hypothermia answered 23/6, 2013 at 12:15 Comment(5)
Interesting observation but I think you are on the wrong track. With print MyClass.i it looks more like you are calling a 'static' variablie i. Where as with a.i you are calling a member variable, i. It seems to me that init is just a constructor that is first executed when you create an object of the class.Ecclesiastic
That's what I was trying to 'explain to myself' with this example - that the variable set by __init__ is what gets passed to instances of the class, not the 'static' variable of the class itself that has the same name...Hypothermia
I think its noteworthy that the first i (i=123) you are creating is an object variable while the second i (self.i = 345) is an instance variable. While instance variables can have different values for each instance of the class, the class variables are the same across all instances created from that class. (Of course one can also change the class variables within the code). So the correct terminology for 'static' variable is object variable and instance variables are declared inside a class method (in this case the init method, but could be also another method of course).Osmometer
And what's the meaning/purpose of this?Declassify
It was more about the inner workings, which could be a gotcha - see my reply comment above :-)Hypothermia
A
49

In short:

  1. self as it suggests, refers to itself- the object which has called the method. That is, if you have N objects calling the method, then self.a will refer to a separate instance of the variable for each of the N objects. Imagine N copies of the variable a for each object
  2. __init__ is what is called as a constructor in other OOP languages such as C++/Java. The basic idea is that it is a special method which is automatically called when an object of that Class is created
Arette answered 9/3, 2009 at 5:41 Comment(0)
O
40

Class objects support two kinds of operations: attribute references and instantiation

Attribute references use the standard syntax used for all attribute references in Python: obj.name. Valid attribute names are all the names that were in the class’s namespace when the class object was created. So, if the class definition looked like this:

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

then MyClass.i and MyClass.f are valid attribute references, returning an integer and a function object, respectively. Class attributes can also be assigned to, so you can change the value of MyClass.i by assignment. __doc__ is also a valid attribute, returning the docstring belonging to the class: "A simple example class".

Class instantiation uses function notation. Just pretend that the class object is a parameterless function that returns a new instance of the class. For example:

x = MyClass()

The instantiation operation (“calling” a class object) creates an empty object. Many classes like to create objects with instances customized to a specific initial state. Therefore a class may define a special method named __init__(), like this:

def __init__(self):
    self.data = []

When a class defines an __init__() method, class instantiation automatically invokes __init__() for the newly-created class instance. So in this example, a new, initialized instance can be obtained by:

x = MyClass()

Of course, the __init__() method may have arguments for greater flexibility. In that case, arguments given to the class instantiation operator are passed on to __init__(). For example,

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart

x = Complex(3.0, -4.5)
x.r, x.i

Taken from official documentation which helped me the most in the end.


Here is my example

class Bill():
    def __init__(self,apples,figs,dates):
        self.apples = apples
        self.figs = figs
        self.dates = dates
        self.bill = apples + figs + dates
        print ("Buy",self.apples,"apples", self.figs,"figs 
                and",self.dates,"dates. 
                Total fruitty bill is",self.bill," pieces of fruit :)")

When you create instance of class Bill:

purchase = Bill(5,6,7)

You get:

> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18  pieces of
> fruit :)
Often answered 1/5, 2018 at 8:17 Comment(0)
R
38

__init__ does act like a constructor. You'll need to pass "self" to any class functions as the first argument if you want them to behave as non-static methods. "self" are instance variables for your class.

Rationale answered 9/3, 2009 at 5:18 Comment(1)
'self' defines if a method is static or not! Wow, thats an eye opener for this java guy.Ebro
I
30

Try out this code. Hope it helps many C programmers like me to Learn Py.

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'Destructor Deleting object - ', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

Output:

Jay

Sum = 5

Doc - Inside Class

Doc - __init__ Constructor

Doc - Inside Show

Destructor Deleting object - Jay

Infeld answered 10/5, 2013 at 3:3 Comment(3)
I don't know if it's just me, but reading this code was a little confusing. Maybe it's because I'm still a novice Python programmer, idk.Stibine
I'm not clear about the doc thing.. does it pull the documentation? and if I do: '''test - my doc''', can I use: print.p.__test__? or is doc a specific keyword?Columbite
@Columbite doc is the keyword for documented details. Triple quotes are used for writing down documents and document is an optional entity.Infeld
L
26

Had trouble undestanding this myself. Even after reading the answers here.

To properly understand the __init__ method you need to understand self.

The self Parameter

The arguments accepted by the __init__ method are :

def __init__(self, arg1, arg2):

But we only actually pass it two arguments :

instance = OurClass('arg1', 'arg2')

Where has the extra argument come from ?

When we access attributes of an object we do it by name (or by reference). Here instance is a reference to our new object. We access the printargs method of the instance object using instance.printargs.

In order to access object attributes from within the __init__ method we need a reference to the object.

Whenever a method is called, a reference to the main object is passed as the first argument. By convention you always call this first argument to your methods self.

This means in the __init__ method we can do :

self.arg1 = arg1
self.arg2 = arg2

Here we are setting attributes on the object. You can verify this by doing the following :

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

values like this are known as object attributes. Here the __init__ method sets the arg1 and arg2 attributes of the instance.

source: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method

Lattice answered 9/1, 2014 at 22:39 Comment(0)
B
22

note that self could actually be any valid python identifier. For example, we could just as easily write, from Chris B's example:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

and it would work exactly the same. It is however recommended to use self because other pythoners will recognize it more easily.

Braid answered 9/3, 2009 at 12:50 Comment(1)
I agree that self would be recommended in place of foo, helps other programmers with looking at the codeStibine
D
20

What does self do? What is it meant to be? Is it mandatory?

The first argument of every class method, including init, is always a reference to the current instance of the class. By convention, this argument is always named self. In the init method, self refers to the newly created object; in other class methods, it refers to the instance whose method was called.

Python doesn't force you on using "self". You can give it any name you want. But remember the first argument in a method definition is a reference to the object. Python adds the self argument to the list for you; you do not need to include it when you call the methods. if you didn't provide self in init method then you will get an error

TypeError: __init___() takes no arguments (1 given)

What does the init method do? Why is it necessary? (etc.)

init is short for initialization. It is a constructor which gets called when you make an instance of the class and it is not necessary. But usually it our practice to write init method for setting default state of the object. If you are not willing to set any state of the object initially then you don't need to write this method.

Ditzel answered 21/10, 2017 at 10:1 Comment(0)
P
19
  1. __init__ is what we call a "constructor", meaning that it's a function which will create the object of the class, given the specified instructions from the parameters we pass into it, and given the "blueprint" - class.
  • Note: Whenever we create an object of a specific class, the function that's been called first is the constructor.
  1. self represents that object inside the class scope. It is essentially a placeholder that helps us keep things clear with the syntax, so we can know when we access a property, or we call a method.
Pelagias answered 3/9, 2015 at 22:19 Comment(1)
the "self" keyword doesn't have to be used, it's just a placeholder. You can use any word, but it's recommended that you use self to help the readability of the programStibine
C
17

Basically, you need to use the 'self' keyword when using a variable in multiple functions within the same class. As for init, it's used to setup default values incase no other functions from within that class are called.

Cloudless answered 23/9, 2012 at 12:2 Comment(2)
There is no 'self' keyword in Python. Calling the first parameter 'self' is simply a convention.Ruelle
self is used as a placeholder basically. It isn't required that you use self, you could use "eeee" or "foo" or something else, it's just recommended for other programmers while reading your codeStibine
P
16

The 'self' is a reference to the class instance

class foo:
    def bar(self):
            print "hi"

Now we can create an instance of foo and call the method on it, the self parameter is added by Python in this case:

f = foo()
f.bar()

But it can be passed in as well if the method call isn't in the context of an instance of the class, the code below does the same thing

f = foo()
foo.bar(f)

Interestingly the variable name 'self' is just a convention. The below definition will work exactly the same.. Having said that it is very strong convention which should be followed always, but it does say something about flexible nature of the language

class foo:
    def bar(s):
            print "hi"
Polydactyl answered 9/3, 2009 at 6:9 Comment(3)
Why does that say anything about the flexible nature of the language? It just says you can give variables any legal name you choose. How is that different from any other programming language?Education
As I wrote in my answer "bar" is just a function where a class instance is provided as the first parameter. So while "bar" is defined as a method bound to "foo" it could also be called with an instance of some other class. This is not how methods and "this" work in Java for example, although I imagine you see that these are the same concept, functions and some instance context (the instance context being the first parameter in Python and "this" in Java"). Perhaps you can now see the flexibility of the language I was referring to?Polydactyl
Yeah that does show the flexibility of the language. The way you phrased your answer, it seemed like you were saying that the fact that you could call the "self" variable something else (like s) was showing the flexibility of python.Education
A
16

Just a demo for the question.

class MyClass:

    def __init__(self):
        print('__init__ is the constructor for a class')

    def __del__(self):
        print('__del__ is the destructor for a class')

    def __enter__(self):
        print('__enter__ is for context manager')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__ is for context manager')

    def greeting(self):
        print('hello python')


if __name__ == '__main__':
    with MyClass() as mycls:
        mycls.greeting()

$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class
Adviser answered 19/4, 2018 at 2:50 Comment(0)
C
14

In this code:

class Cat:
    def __init__(self, name):
        self.name = name
    def info(self):
        print 'I am a cat and I am called', self.name

Here __init__ acts as a constructor for the class and when an object is instantiated, this function is called. self represents the instantiating object.

c = Cat('Kitty')
c.info()

The result of the above statements will be as follows:

I am a cat and I am called Kitty
Camire answered 25/8, 2015 at 22:2 Comment(0)
B
11
# Source: Class and Instance Variables
# https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass(object):
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__(self):
        # self usage => instance variable (per object)
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func():
    # PRINTS    10    (class variable)
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass()

    # PRINTS    15    (instance variable)
    print obj1.my_OBJ_var

    # PRINTS    20    (class variable, changed value)
    print MyClass.my_CLS_var


run_example_func()
Burbage answered 2/7, 2016 at 4:15 Comment(0)
C
7

Here, the guy has written pretty well and simple: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/

Read above link as a reference to this:

self? So what's with that self parameter to all of the Customer methods? What is it? Why, it's the instance, of course! Put another way, a method like withdraw defines the instructions for withdrawing money from some abstract customer's account. Calling jeff.withdraw(100.0) puts those instructions to use on the jeff instance.

So when we say def withdraw(self, amount):, we're saying, "here's how you withdraw money from a Customer object (which we'll call self) and a dollar figure (which we'll call amount). self is the instance of the Customer that withdraw is being called on. That's not me making analogies, either. jeff.withdraw(100.0) is just shorthand for Customer.withdraw(jeff, 100.0), which is perfectly valid (if not often seen) code.

init self may make sense for other methods, but what about init? When we call init, we're in the process of creating an object, so how can there already be a self? Python allows us to extend the self pattern to when objects are constructed as well, even though it doesn't exactly fit. Just imagine that jeff = Customer('Jeff Knupp', 1000.0) is the same as calling jeff = Customer(jeff, 'Jeff Knupp', 1000.0); the jeff that's passed in is also made the result.

This is why when we call init, we initialize objects by saying things like self.name = name. Remember, since self is the instance, this is equivalent to saying jeff.name = name, which is the same as jeff.name = 'Jeff Knupp. Similarly, self.balance = balance is the same as jeff.balance = 1000.0. After these two lines, we consider the Customer object "initialized" and ready for use.

Be careful what you __init__

After init has finished, the caller can rightly assume that the object is ready to use. That is, after jeff = Customer('Jeff Knupp', 1000.0), we can start making deposit and withdraw calls on jeff; jeff is a fully-initialized object.

Cham answered 13/8, 2015 at 12:22 Comment(0)
K
7

Python __init__ and self what do they do?

What does self do? What is it meant to be? Is it mandatory?

What does the __init__ method do? Why is it necessary? (etc.)

The example given is not correct, so let me create a correct example based on it:

class SomeObject(object):

    def __init__(self, blah):
        self.blah = blah

    def method(self):
        return self.blah 

When we create an instance of the object, the __init__ is called to customize the object after it has been created. That is, when we call SomeObject with 'blah' below (which could be anything), it gets passed to the __init__ function as the argument, blah:

an_object = SomeObject('blah')

The self argument is the instance of SomeObject that will be assigned to an_object.

Later, we might want to call a method on this object:

an_object.method()

Doing the dotted lookup, that is, an_object.method, binds the instance to an instance of the function, and the method (as called above) is now a "bound" method - which means we do not need to explicitly pass the instance to the method call.

The method call gets the instance because it was bound on the dotted lookup, and when called, then executes whatever code it was programmed to perform.

The implicitly passed self argument is called self by convention. We could use any other legal Python name, but you will likely get tarred and feathered by other Python programmers if you change it to something else.

__init__ is a special method, documented in the Python datamodel documentation. It is called immediately after the instance is created (usually via __new__ - although __new__ is not required unless you are subclassing an immutable datatype).

Koph answered 25/10, 2017 at 20:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.