classmethod在这段代码中做了什么?
在django.utils.tree.py中:
def _new_instance(cls, children=None, connector=None, negated=False):
obj = Node(children, connector, negated)
obj.__class__ = cls
return obj
_new_instance = classmethod(_new_instance)
我不知道这个代码示例中使用了什么classmethod
。 有人可以解释它做了什么以及如何使用它?
classmethod
是一个描述符,包装一个函数,并且你可以在一个类或者(等价地)一个实例上调用结果对象:
>>> class x(object):
... def c1(*args): print 'c1', args
... c1 = classmethod(c1)
... @classmethod
... def c2(*args): print 'c2', args
...
>>> inst = x()
>>> x.c1()
c1 (<class '__main__.x'>,)
>>> x.c2()
c2 (<class '__main__.x'>,)
>>> inst.c1()
c1 (<class '__main__.x'>,)
>>> inst.c2()
c2 (<class '__main__.x'>,)
正如你所看到的,不管你是直接定义它还是使用装饰器语法来定义它,并且无论你是在类还是实例上调用它, classmethod
总是接收该类作为它的第一个参数。
classmethod的主要用途之一是定义“替代构造函数”:
>>> class y(object):
... def __init__(self, astring):
... self.s = astring
... @classmethod
... def fromlist(cls, alist):
... x = cls('')
... x.s = ','.join(str(s) for s in alist)
... return x
... def __repr__(self):
... return 'y(%r)' % self.s
...
>>> y1 = y('xx')
>>> y1
y('xx')
>>> y2 = y.fromlist(range(3))
>>> y2
y('0,1,2')
现在,如果你继承y
,classmethod继续工作,例如:
>>> class k(y):
... def __repr__(self):
... return 'k(%r)' % self.s.upper()
...
>>> k1 = k.fromlist(['za','bu'])
>>> k1
k('ZA,BU')
它可以调用类而不是对象的方法:
class MyClass(object):
def _new_instance(cls, blah):
pass
_new_instance = classmethod(_new_instance)
MyClass._new_instance("blah")
链接地址: http://www.djcxy.com/p/9175.html
上一篇: What does classmethod do in this code?
下一篇: in python,what is the difference below, and which is better