Anonymous
Anonymous

Reputation: 11

Python understanding classes and functions

New to python and have been working on improving my skills overall, however, I struggle with understanding classes and functions.

Why can or can't I do the following code below

class Person():
    name = 'Tom'
    age = 31
    has_job = False

Person.name = 'Tom'
Person.age = 31
Person.has_job = False  
print(Person.name, Person.age, Person.has_job)

compared to this

class Person():
    def __init__(self, name, age, has_job):
        self.name = name
        self.age = age
        self.has_job = has_job

    
p1 = Person('Tom', 31, False)

Is this just bad practice or is it something else entirely?

Upvotes: 0

Views: 51

Answers (3)

Timaayy
Timaayy

Reputation: 858

In the first section of your code you are trying to define class attributes. These are attributes that do not change between instances of your class. On the other hand if you define variables in the def init(self) method these are parameters you must pass when creating the class and will be unique to each instance of the class you create. These are called instance attributes.

class Person():
   # these are class attributes.
   name = 'Tom'
   age = 31
   has_job = False

class Person2():
   def __init__(self, name, age, has_job)
    # these are instance attributes
    self.name = name
    self.age = age
    self.has_job = has_job

In your first code snippet you did not indent the classes attributes appropriately when you created the class. Check my example above to see how that would be done.

So in your case since each person will be a new instance of your Person class, you do not want to have name, age and has_job as class attributes since those are unique to every person you create. If you had those variables as class attributes then each person you create using your Person() class will have the same name, age, and has_job values.

If you created a class with class attributes and then changed the class attributes of the class instance every time it would not be pythonic. Rather you should create instances of the class with instance attributes.

I HIGHLY recommend watching Corey Shafer OOP tutorials on youtube as they cover all this extensively: https://www.youtube.com/watch?v=ZDa-Z5JzLYM&list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU&index=40

Upvotes: 0

Claudiu Felix
Claudiu Felix

Reputation: 33

I don't think that writing a class like your first example would be very usefull, because the attributes remain the same for each instance. That means that every Person will be called by default 'Tom', will have the age: 41 and "has_job" will be set to false.

In the second example you've got a specific constructor that will initialise those variables and that's going to be more usefull. There's only one problem: you forgot to put ":" after def __init__(self, name, age, has_job) .

Also be aware of the indentation.

Your code should look like this:

class Person():
    def __init__(self, name, age, has_job):
        self.name = name
        self.age = age
        self.has_job = has_job
 
    
p1 = Person('Tom', 31, False)
print(p1.name);

Upvotes: 1

PurpleLlama
PurpleLlama

Reputation: 178

Python is white space sensitive. Unless you want to change the default values in you class you do not need to redefine them.

class Person():
    name = 'Tom'
    age = 31
    has_job = False
'''
change these will change the class values
Person.name = 'Tom'
Person.age = 31
Person.has_job = False  
'''
print(Person.name, Person.age, Person.has_job)

Upvotes: 0

Related Questions