【问题标题】: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 中有效