2009-02-10 18 views
16

मैंने सोचा कि मुझे प्रोग्रामिंग के "पायथन मार्ग" पर पकड़ मिलना शुरू हो रहा था। कक्षा के तरीके स्वयं को कक्षा के उदाहरण के संदर्भ में पहला पैरामीटर मानते हैं जिसका संदर्भ विधि में कहा जा रहा है। @classmethod सजावटी एक विधि को संदर्भित करता है जिसकी कार्यक्षमता कक्षा से जुड़ी है, लेकिन जो संदर्भ नहीं देती है विशिष्ट उदाहरण@classmethod में 'स्वयं' का क्या संदर्भ है?

तो, @classmethod (canonically 'self') का पहला पैरामीटर क्या संदर्भ देता है कि विधि को उदाहरण संदर्भ के बिना बुलाया जाना है या नहीं?

उत्तर

34

class itself:

एक वर्ग विधि, अंतर्निहित पहले तर्क के रूप में वर्ग को मिलने वाले एक उदाहरण विधि जैसे उदाहरण प्राप्त करता है।

class C: 
    @classmethod 
    def f(cls): 
     print(cls.__name__, type(cls)) 

>>> C.f() 
C <class 'type'> 

और यह धर्मविधान cls है, btw

+0

+1: उद्धरण प्रलेखन –

0

वर्ग वस्तु पहले पैरामीटर के रूप में पारित हो जाता है। उदाहरण के लिए:

class Foo(object): 
    @classmethod 
    def bar(self): 
     return self() 

फू क्लास का एक उदाहरण वापस कर देगा।

संपादित:

ध्यान दें कि अंतिम पंक्ति स्वयं() नहीं आत्म होगा। स्वयं कक्षा को वापस कर देगा, जबकि स्वयं() एक उदाहरण देता है।

+3

यह सही है, लेकिन यह ध्यान रखना महत्वपूर्ण है कि 'cls' का उपयोग आमतौर पर क्लासमेड के पहले पैरामीटर के रूप में किया जाता है। – Lenna

12

क्लासमेड के पहले पैरामीटर को cls नाम से सम्मेलन द्वारा नामित किया गया है और क्लास ऑब्जेक्ट को संदर्भित करता है जिस पर इसे कहा गया था।

>>> class A(object): 
...  @classmethod 
...  def m(cls): 
...   print cls is A 
...   print issubclass(cls, A) 

>>> class B(A): pass 
>>> a = A() 
>>> a.m() 
True 
True 
>>> b = B() 
>>> b.m() 
False 
True 
0

Django एक वर्ग विधि यहाँ के साथ कुछ अजीब सामान करता है:

class BaseFormSet(StrAndUnicode): 
    """ 
    A collection of instances of the same Form class. 
    """ 
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
       initial=None, error_class=ErrorList): 
     ... 
     self.prefix = prefix or self.get_default_prefix() 
     ... 

हालांकि get_default_prefix इस तरह से घोषित किया जाता है (एक ही कक्षा में):

@classmethod 
    def get_default_prefix(cls): 
     return 'form' 
संबंधित मुद्दे