Is there any difference in functionality and what happens behind the scenes between
class Class:
    def __init__(self, var1):
        self.var1 = var1
and
class Class:
    var1 = ""
    def __init__(self, var1):
        self.var1 = var1
in Python?
Let's explore a bit. This is your class:
class Class:
    var1 = 'in class'
    def __init__(self, var1):
        self.var1 = var1
c = Class('in inst')
Accessing c.var1 shows the var1 from the instance:
>>> c.var1
'in inst'
It is located inside __dict__ of c:
>>> c.__dict__
{'var1': 'in inst'}
The class variable var1 is in  __dict__ of Class:
>>> Class.__dict__['var1']
'in class'
Now make a class with only a class variable:
class Class2:
    var1 = 'in class'
c2 = Class2()
Since there is nothing in the instance, var1 from the class will be used:
>>> c2.var1
'in class'
The __dict__ of c2 is empty:
>>> c2.__dict__
{}
Python always looks for var1 first in the instance and than falls back to the class. 
As I pointed out in comment, the Class.var1 is a shared variable. It could be accessed for each instance as self.var1 if you don't erase it with a non-shared variable in __init__. Here is a sample of what happens :
class Test(object):
    shared = 0
    def __init__(self, i):
        self.notshared = i
    def intro(self):
        print("Shared is " + str(self.shared))
        print("NotShared is " + str(self.notshared))
test1 = Test(4)
test1.intro()
# Shared is 0
# NotShared is 4
Test.shared = 5
test1.intro()
# Shared is 5
# NotShared is 4
test2 = Test(3)
test2.intro()
# Shared is 5
# NotShared is 3
Be aware however that if you write the self.shared variable afterwards, you do not access the shared variable with self.shared anymore:
test1.shared = 12
test1.intro()
# Shared is 12
# NotShared is 4
test2.intro()
# Shared is 5
# NotShared is 3
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With