对于classmethods,第一个参数是调用类方法的类,而不是通常的self for instance方法(除非另有说明,否则隐式地使用类中的所有方法).
这是一个例子 – 为了练习,我添加了一个检查cls参数标识的异常.
class Base(object):
@classmethod
def acquire(cls, param):
if cls is Base:
raise Exception("Must be called via subclass :(")
return "this is the result of `acquire`ing a %r with %r" % (cls, param)
class Something(Base):
pass
class AnotherThing(Base):
pass
print Something.acquire("example")
print AnotherThing.acquire("another example")
print Base.acquire("this will crash")
this is the result of `acquire`ing a with 'example'
this is the result of `acquire`ing a with 'another example'
Traceback (most recent call last):
File "classmethod.py", line 16, in
print Base.acquire("this will crash")
File "classmethod.py", line 5, in acquire
raise Exception("Must be called via subclass :(")
Exception: Must be called via subclass :(