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

44 投票
3 回答
19282 浏览
提问于 2025-04-16 03:27

如果我定义了:

class Bar(object):

    @staticmethod
    def bar():
        # code
        pass

class Foo(Bar):
    # code
    pass

那么,调用一个函数 Foo.bar() 能不能知道它所属的类名 Foo 呢?

3 个回答

2

如果你需要从静态方法(而不是类方法)中确定类名,下面的代码可能会对你有帮助:

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
3

如果你需要找到类的信息,正确的方法是使用 @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
58

把静态方法换成类方法。这样在调用的时候,会把类本身传给它,所以你可以从中获取类的名字。

class Bar(object):

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

class Foo(Bar):
    # code
    pass

>>> Bar.bar()
Bar

>>> Foo.bar()
Foo

撰写回答