1

if I create a class called Car

class Car():
    '''car information summary'''
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer = 0

I learned that self.odometer=0 allowed me creating a new instance without putting a value for odometer. Every new instance will start with an odometer reading at 0.

But what if I want to create an new instance with a specified odometer reading?

car_1 = Car('Audi', 'S4', '2017', 5000)

It won't allow me to do so. What I am trying to do is to use it like a default value for a function: You don't have to give a value because there is a default, but when you do, you can overwrite the default.

And I do understand that I can revise the attribute afterwards, or write a method to change the attribute. But that's not my concern for now.

Is this a wrong idea to have for OOP?

1 Answer 1

7

Python supports the concept of parameters with a default value. You can write a parameter, and give it a default value if it is not specified. In this case it looks like:

class Car():
    '''car information summary'''

    def __init__(self, make, model, year, odometer=0):
        self.make = make
        self.model = model
        self.year = year
        self.odometer = odometer

So in case you call it with three parameters, Python will see that you did not provide a value for the odometer parameter, and it will implicitly assign zero to it.

A point that sometimes causes confusion is that the default values are only evaluated once, at interpretation time, not each time you call the __init__ function.

For example if we write:

def f(x=[]):
    return x

Then Python will evaluate [] only once. And each time you do not provide a value for x, you will obtain a reference to the same list (not a new list every time).

Therefore it is usally dangerous to use mutable types (an int is not a mutable type, so we are safe for the odometer=0).

If we thus for instance .append(3) to the outcome of f(), then from now on, f() will return that list ([3]). Which is usually not the intended effect. Some IDEs will give warnings if you use a mutable object.

If you want a new empty list each time x is not provided, a common pattern is:

def f(x=None):
    if x is None:
        x = []
    return x
Sign up to request clarification or add additional context in comments.

2 Comments

got it!! Thanks!!
can you elaborate the last sentence with an example? I am not sure what it really means

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.