【问题标题】:What is the Python equivalent of a Ruby class method?Ruby 类方法的 Python 等价物是什么?
【发布时间】:2011-05-05 23:38:29
【问题描述】:

在 ruby​​ 中你可以这样做:

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

【问题讨论】:

    标签: python ruby oop static-methods class-method


    【解决方案1】:

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

    @staticmethod
    def foo():     # No implicit parameter
        print 'foo'  
    
    
    @classmethod
    def foo(cls):   # Class as implicit paramter
        print cls
    

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

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

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

    【讨论】:

      【解决方案2】:

      您正在寻找的是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())。

      【讨论】:

        【解决方案3】:

        你也可以使用__class__在静态方法中访问类对象:

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

        至少这在 Python 3.1 中有效

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-14
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2014-12-29
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          相关资源
          最近更新 更多