Reputation: 984
If I define:
class Bar(object):
@staticmethod
def bar():
# code
pass
class Foo(Bar):
# code
pass
Is it possible for a function call Foo.bar() to determine the class name Foo?
Upvotes: 47
Views: 21295
Reputation: 504
As option, if you need determine class from staticmethod (not classmethod) I guess following code could be helpful:
class Bar(object):
@staticmethod
def bar():
pass
class Foo(Bar):
pass
foo_instance = Foo()
bar_static_function = foo_instance.bar
class_name = bar_static_function.__qualname__.split(".")[0]
print(class_name) # Foo
Upvotes: 3
Reputation: 24672
If you need to find the class information, the appropriate way is to use @classmethod
.
class Bar(object):
@classmethod
def bar(cls):
# code
print(cls.__name__)
class Foo(Bar):
# code
pass
Now your bar
method has a reference to the class as cls
which is the actual class of the caller. And as shown in the code, cls.__name__
is the name of the class you are looking for.
>>> Foo.bar()
Foo
>>> Bar.bar()
Bar
Upvotes: 2
Reputation: 26592
Replace the staticmethod with a classmethod. This will be passed the class when it is called, so you can get the class name from that.
class Bar(object):
@classmethod
def bar(cls):
# code
print cls.__name__
class Foo(Bar):
# code
pass
>>> Bar.bar()
Bar
>>> Foo.bar()
Foo
Upvotes: 60