I made a post here functions and class attributes (python)
When you define a class attribute and gave it a function like this:
example 1
def add_age(cls,age):
    cls.yrs_old = age
    return cls
class Test:
    age = add_age
a = Test()
a.age(5)
print(a.yrs_old)
self is automatically passed as the first argument of the add_age function.
However toying around with it more doing the same thing but this time passing the function as an instance attribute like this:
example 2
def test_func(self):
    self.class_attribute = "test"
class Test:
    def __init__(self,func):
        self.func = func
a = Test(test_func)
print(a.func())
Answers in the linked post stated that all functions in the class are automatically passed a self if the class is instantiated like this:
a = Test(test_func)
Now what's strange here is had I put test_func in a class attribute it works just like my very first example.
If you pass the function in the constructor/init like this:
def test_func(self):
    self.class_attribute = "test" 
class Test:
    def __init__(self,func):
        self.func = func
and call it like this:
a = Test(test_func)
print(a.func())
a.func is suddenly acting like a static method as opposed to example 1 where the function defined inside the class attribute becomes a regular class method.
What's going on?.
I thought all functions within a class are implicitly passed a self argument.
 
     
     
    