Suppose I have two classes A and B, where B inherits from A. A and B both have a bar method. A has a foo method which is inherited by B.
I now want bar from A to be called whenever foo is called, irrespective of whether an object is an instance of B or A.
I googled and found that I should probably use @staticmethod. Is something like this correct? Or is it bad programming or some kind of logic error?
class A:
def foo(self):
self.bar()
A.bar_static()
def bar(self):
print('Iam A')
@staticmethod
def bar_static():
print('Iam A')
class B(A):
def bar(self):
print('Iam B')
@staticmethod
def bar_static():
print('Iam B')
Output (this is what I want):
b = B()
b.foo()
Iam B
Iam A
Edit:
A possible Application is to compute a (thermodynamic) property, via a prop function. prop needs to call prop_aux to compute stuff. prop and prop_aux are implemented by both, A and B, which are different models (B is an extension of A and therefore inherits from A). Now, the B implementation of prop calls the B implementation of prop_aux. However, since it's only extending the existing A model, it also calls the A implementation of prop (via super()). To compute stuff, the A implementation of prop calls prop_aux. When this happens, the A implementation of prop shall call the A implementation of prop_aux and not the B implementation of prop_aux (which would happen the self object is of class B.
You could use
staticmethodhere. I will say, this seems like code smell in the design of your class.And like most applications of
staticmethod, just defining and using a regular function would suffice and probably be easier to understand: