9

在红宝石中,您可以这样做:

class A
    def self.a
        'A.a'
    end
end

puts A.a #-> A.a

这如何在 python 中完成。我需要调用一个类的方法,而不是在类的实例上调用它。当我尝试这样做时,我收到此错误:

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead)

这是我尝试过的:

class A
    def a():
       return 'A.a'

print A.a()
4

3 回答 3

18

您正在寻找的是staticmethod装饰器,它可用于制作不需要第一个隐式参数的方法。它可以这样使用:

class A(object):
    @staticmethod
    def a():
        return 'A.a'

另一方面,如果您希望从方法中访问类(而不是实例),则可以使用classmethod装饰器,其使用方式几乎相同:

class A(object):
    @classmethod
    def a(cls):
        return '%s.a' % cls.__name__

仍然可以在不实例化对象 ( A.a()) 的情况下调用它。

于 2010-11-06T09:53:25.443 回答
10

有两种方法可以做到这一点:

@staticmethod
def foo():     # No implicit parameter
    print 'foo'  


@classmethod
def foo(cls):   # Class as implicit paramter
    print cls

不同之处在于静态方法根本没有隐式参数。类方法接收调用它的类的方式与普通方法接收实例的方式完全相同。

您使用哪一个取决于您是否希望该方法可以访问该类。

任何一个都可以在没有实例的情况下调用。

于 2010-11-06T09:53:05.317 回答
0

您还可以使用静态方法访问类对象__class__

class A() :
    @staticmethod
    def a() :
        return '{}.a'.format( __class__.__name__ )

至少这适用于 Python 3.1

于 2010-11-06T12:37:04.460 回答