【问题标题】:How to get (sub)class name from a static method in Python?如何从 Python 中的静态方法获取(子)类名?
【发布时间】:2010-08-29 21:18:13
【问题描述】:

如果我定义:

class Bar(object):

    @staticmethod
    def bar():
        # code
        pass

class Foo(Bar):
    # code
    pass

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

【问题讨论】:

    标签: python reflection function-call static-methods


    【解决方案1】:

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

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

    【讨论】:

    • 这没有回答问题。问题是如何使用静态方法来做到这一点。
    • 如果无法做到这一点会发生什么——例如,第三方库依赖于特定的签名?
    • classmethods 是“静态”方法,它们无法访问需要 self 参数的对象,cls 只能访问类而不是对象实例。不同的是classmethod可以修改Class本身的状态@sebix
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 2012-03-04
        • 2022-10-06
        • 2016-08-04
        相关资源
        最近更新 更多