【问题标题】:python how to call static method from inside of a class body [duplicate]python如何从类体内调用静态方法[重复]
【发布时间】:2018-01-13 17:24:26
【问题描述】:

假设我有一个带有静态方法的类,并且我希望将类属性设置为该方法返回的值:

class A:
    @staticmethod
    def foo():
        return 12

     baz = foo()

但是这样做我得到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in A
TypeError: 'staticmethod' object is not callable

我找到了解决这个问题的方法:

class A:
    class B:
        @staticmethod
        def foo():
            return 2
baz = B.foo()

但是例如,如果我写:

class A:
    class B:
        @staticmethod
        def foo():
            return 2

    class C:
        baz = B.foo()

我也得到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in A
  File "<stdin>", line 7, in C
NameError: name 'B' is not defined

有没有办法在声明类时从类中调用静态方法? 为什么代码的第一个和第三个示例不起作用但第二个可以? python解释器如何处理这样的声明?

【问题讨论】:

    标签: python class subclass static-methods class-method


    【解决方案1】:

    staticmethod 是一个描述符。描述符公开了__get__(instance, cls) 方法,允许通过实例或类级别访问它。

    现在,在您的情况下,您希望在类节中调用它。通常这是不可能的,因为实例和类都不可用。但是,staticmethod 在任何情况下都会忽略两者,因此您可以使用以下相当讨厌的方法来调用它。

    class A:
        @staticmethod
        def foo():
            return 12
    
        baz = foo.__get__(None, object)()
    

    然后

    >>> A.baz
    12
    

    注意:传递object 作为第二个参数的唯一原因是staticmethod 坚持传递某种类作为第二个参数。

    【讨论】:

      【解决方案2】:

      这也是一种解决方法,但它可能会有所帮助。

      在class 正文中,您不能引用正在创建的类。 OTOH一个类装饰器接收一个初始化的类,因此它可以直接调用它的方法。

      def add_baz(cls):
          cls.baz = cls.foo()
          return cls 
      
      @add_baz
      class A:
          @staticmethod
          def foo():
              return 12
      

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 2018-02-15
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 2017-10-10
        • 2013-01-12
        相关资源
        最近更新 更多