[Tutor] When to use def __init__ when making a class?

brandon w thisisonlyatest at gmx.com
Thu Aug 4 03:19:40 CEST 2011


On 08/02/2011 09:25 PM, Steven D'Aprano wrote:
> brandon w wrote:
>> I have two questions:
>>
>> 1)  When should I use "def __init__(self):" when I create a class?
>
> Whenever you need something to happen when you create an instance.
>
>
>> 2)  Would these two classes have the same effect?
>
> Technically, no, but in practice, you would find it hard to see the 
> difference for the example given. But for slightly different examples, 
> the difference would be astonishing.
>
>
>
>> class Name:
>>         def __init__(self):
>>                 man = Marcus
>>                 woman = Jasmine
>>                 return self.man, self.woman
>
> Did you try the code before posting it?
>
> Three problems with it:
>
> (1) Firstly, Marcus and Jasmine are not built-in Python commands, so 
> trying to execute man = Marcus raises NameError. You need to use 
> quotation marks to turn it into a string.
>
> (2) Fixing that problem, man = "Marcus" doesn't do what you expect 
> either, because it creates a local variable man and not an attribute.
>
> (3) Last but not least, the return result of __init__ is ignored, so 
> even though you try to return self.man and self.women, nothing happens.
>
> Also, calling the class "Name" is a bad idea, because it doesn't have 
> anything to do with what the class actually holds, which is a *pair* 
> of names, one male and one female.
>
>
> This code should be written as:
>
>
> class Couple:
>     def __init__(self):
>         self.man = "Marcus"
>         self.woman = "Jasmine"
>
>
> This creates a class where every instance has its own independent 
> attributes man and woman.
>
>
>> class Name:
>>         man = Marcus
>>         woman = Jasmine
>>         return man, woman
>
>
> Again, did you try this? If you did, you would discover it raises 
> SyntaxError: you can't include a return statement inside a class, 
> because it is meaningless.
>
> SyntaxError: 'return' outside function
>
> This should be written as
>
> class Couple:
>     man = "Marcus"
>     woman = "Jasmine"
>
>
> This creates a class where every instance shares the same pair of 
> attributes.
>
>
>
> In this example, the difference is not very great, because strings 
> cannot be modified in place. If you try to store a new value for the 
> attribute, Python defaults to creating an independent instance 
> attribute rather than changing the shared class attribute.
>
>
> Here is an example that may help show the difference:
>
>
> class TestAttributes:
>     a = [1, 2, 3]  # Shared, and mutable.
>     def __init__(self):
>         self.b = [1, 2, 3]  # Not shared.
>
>
> Now, using this:
>
>
> >>> x = TestAttributes()  # Create a new instance.
> >>> y = TestAttributes()  # And another one.
> >>>
> >>> x.a
> [1, 2, 3]
> >>> y.a
> [1, 2, 3]
> >>> x.a.append(42)  # Modify the SHARED list.
> >>> y.a  # And all instances see the change!
> [1, 2, 3, 42]
> >>>
> >>> x.b
> [1, 2, 3]
> >>> x.b.append(999)  # Modify the non-shared list.
> >>> x.b
> [1, 2, 3, 999]
> >>> y.b  # Other instances are unchanged.
> [1, 2, 3]
>
>
>
>
>
I see. Thank you very much for the example that you have given me. This 
is clear and concise. I did forget to put the quotes around the names 
Marcus and Jasmine. I learn something new everyday....



More information about the Tutor mailing list