2017-08-06 120 views
1

假设我有一个类,它有一个静态方法,我想一个类属性被设置为值,这个方法返回:蟒蛇如何从类主体的内部调用静态方法

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() 

但EXA mple如果我写:

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解释器如何处理这种声明?

回答

1

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

现在在你的情况下,你想打电话给它在一节课节。通常情况下这是不可能的,因为实例和类都不可用。然而staticmethod在任何情况下都会忽略,所以你可以使用下面相当讨厌的方法来调用它。

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

    baz = foo.__get__(None, object)() 

然后

>>> A.baz 
12 

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

0

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

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

def add_baz(cls): 
    cls.baz = cls.foo() 
    return cls 

@add_baz 
class A: 
    @staticmethod 
    def foo(): 
     return 12 
相关问题