如何从Python中的静态方法获取(子)类名?

时间:2010-08-29 21:18:14

标签: python reflection function-call static-methods

如果我定义:

class Bar(object):

    @staticmethod
    def bar():
        # code
        pass

class Foo(Bar):
    # code
    pass

函数调用Foo.bar()是否可以确定类名Foo?

3 个答案:

答案 0 :(得分:34)

用classmethod替换static方法。这将在调用时传递给类,因此您可以从中获取类名。

class Bar(object):

    @classmethod
    def bar(cls):
        # code
        print cls.__name__

class Foo(Bar):
    # code
    pass

>>> Bar.bar()
Bar

>>> Foo.bar()
Foo

答案 1 :(得分:2)

如果您需要查找课程信息,适当的方法是使用@classmethod

class Bar(object):
    @classmethod
    def bar(cls):
        # code
        print(cls.__name__)

class Foo(Bar):
    # code
    pass

现在,您的bar方法将类引用为cls,这是调用者的实际类。如代码所示,cls.__name__是您要查找的类的名称

>>> Foo.bar()
Foo
>>> Bar.bar()
Bar

答案 2 :(得分:0)

作为选项,如果您需要从静态方法(而不是类方法)确定类,我想以下代码可能会有所帮助:

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