I am very new to programming. I just started for couple weeks. I spent hours reading about class but I am still confused. I have a specific question.

I am confused on when to use class attributes, and when to use initializer (`__init__`).

I understand that when using `__init__`, I don't assign any value immediately, but only need to assign value when I create an object using that class. And class attributes are automatically inherent to the object created under that class.

But in term of practical use, do they accomplished the same thing? Are they just two different ways to do the same thing? Or is `__init__` does something that class attributes can't do?

I went some testing with these codes, the results are the same. I am confused when to use which. To me class attribute looks more convenient to use. 

```
#use class attributes for class Numbers_1
class Numbers_1:

  one = 1
  two = 2
  three = 3
  six = two * three

def multiply(self):
   return self.six * self.two * self.three

 #use initializer for class Numbers_2    
 class Numbers_2:

 def __init__(self, num10, num20, num30, num600):
   self.num10 = num10
   self.num20 = num20
   self.num30 = num30
   self.num600 = num600

 def multiply(self):
   return self.num600 * self.num20 * self.num30

 #Now I run some test to compare the two classes...
 x = Numbers_1()
 y = Numbers_2(10, 20, 30, 20*30)

 print(x.one)     #print 1
 print(y.num10)   #print 10

 print(x.six)     #print 6
 print(y.num600)  #print 600

 #assign attributes to each objects
 x.eighteen = x.six * x.three 
 y.num18000 = y.num600 * y.num30

 print(x.eighteen)   #print 18
 print(y.num18000)   #print 18000

 #try printing methods in each object
 print(x.multiply()) #print 36
 print(y.multiply()) #print 360000

 #try reassign values to attributes in each object
 x.one = 100
 y.num10 = 1000

 print(x.one)     #prints 100
 print(y.num10)   #prints 1000

```