ए classmethod
ऑब्जेक्ट एक वर्णनकर्ता है। आपको समझने की जरूरत है कि वर्णनकर्ता कैसे काम करते हैं। self
, एक instance
, और एक instance type
:
संक्षेप में, एक विवरणक एक वस्तु है जो एक विधि __get__
है, जो तीन तर्क लेता है।
सामान्य विशेषता देखने के दौरान, यदि एक देखा-अप वस्तु A
एक विधि __get__
है, उस विधि कहा जाता है और हो जाता है क्या यह रिटर्न वस्तु A
के लिए जगह में दिया जाता है। जब आप ऑब्जेक्ट पर कोई विधि कॉल करते हैं तो इस तरह फ़ंक्शन (जो वर्णनकर्ता भी होते हैं) बाध्य विधियां बन जाते हैं।
class Foo(object):
def bar(self, arg1, arg2):
print arg1, arg2
foo = Foo()
# this:
foo.bar(1,2) # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2) # prints '1 2'
ए classmethod
ऑब्जेक्ट एक ही तरीके से काम करता है। जब इसे देखा जाता है, तो इसकी __get__
विधि कॉल हो जाती है। __get__
क्लासमाइट के instance
(अगर कोई था) से संबंधित तर्क को त्याग देता है और केवल instance_type
के साथ गुजरता है जब यह लपेटा हुआ फ़ंक्शन पर __get__
पर कॉल करता है।
एक उदाहरण डूडल:
In [14]: def foo(cls):
....: print cls
....:
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>
वर्णनकर्ता बारे में अधिक जानकारी यहां पाया जा सकता (अन्य स्थानों में): http://users.rcn.com/python/download/Descriptor.htm
समारोह एक classmethod
से लिपटे के नाम होने का विशिष्ट कार्य के लिए :
In [29]: cm.__get__(None, dict).im_func.__name__
Out[29]: 'foo'
मुझे "गायब" '__name__' के बारे में अंतर्दृष्टि नहीं है, लेकिन यह सुनिश्चित करने के लिए कि कक्षाओं के पास' __call__' wrapper है। – mjv