什么是Python类方法的Python等价物?

dav*_*dev 9 ruby python oop static-methods class-method

在ruby中你可以这样做:

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

puts A.a #-> A.a
Run Code Online (Sandbox Code Playgroud)

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

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead)
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

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

print A.a()
Run Code Online (Sandbox Code Playgroud)

mde*_*ous 18

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

class A(object):
    @staticmethod
    def a():
        return 'A.a'
Run Code Online (Sandbox Code Playgroud)

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

class A(object):
    @classmethod
    def a(cls):
        return '%s.a' % cls.__name__
Run Code Online (Sandbox Code Playgroud)

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


aar*_*ing 10

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

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


@classmethod
def foo(cls):   # Class as implicit paramter
    print cls
Run Code Online (Sandbox Code Playgroud)

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

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

可以在没有实例的情况下调用其中任何一个.