2012-08-24 20 views
5

के निर्माण पर कक्षा विधि को कॉल करना मैं कक्षा निर्माण पर स्वचालित रूप से कुछ कोड चलाने के लिए चाहता हूं जो अन्य वर्ग विधियों को कॉल कर सकता है। मुझे कक्षा घोषणा के भीतर से ऐसा करने का कोई तरीका नहीं मिला है और @classmethod को __clsinit__ कहा जाता है और कक्षा घोषणा के तुरंत बाद परिभाषित क्षेत्र से इसे कॉल करता है। क्या कोई तरीका है जिसे मैं परिभाषित कर सकता हूं कि क्लास ऑब्जेक्ट बनने के बाद इसे स्वचालित रूप से कॉल किया जाएगा?पायथन कक्षा

+2

कक्षा निर्माण या उदाहरण के निर्माण? क्योंकि दोनों किया जा सकता है, लेकिन जवाब अलग-अलग है। –

+1

आप इसके लिए मेटाक्लास का उपयोग कर सकते हैं। उदाहरण के लिए देखें [यह प्रश्न] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)। – BrenBarn

+6

इसके अलावा: कृपया '__special_methods__' न बनाएं। यह पायथन भाषा के लिए आरक्षित है। यदि आप इसे निजी बनाना चाहते हैं तो '_single_underscore_prefix' का उपयोग करें। – delnan

उत्तर

10

आप इसे metaclass या class decorator के साथ कर सकते हैं।

एक वर्ग डेकोरेटर (2.6 के बाद से) को समझने के लिए शायद आसान है:

def call_clsinit(cls): 
    cls._clsinit() 
    return cls 

@call_clsinit 
class MyClass: 
    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 

Metaclasses अधिक शक्तिशाली होते हैं; वे कोड फोन और इससे पहले कि यह करने के साथ ही बाद में बनाई गई है वर्ग की सामग्री को संशोधित कर सकते हैं (यह भी, वे विरासत में मिला जा सकता है):

def call_clsinit(*args, **kwargs): 
    cls = type(*args, **kwargs) 
    cls._clsinit() 
    return cls; 

class MyClass(object): 
    __metaclass__ = call_clsinit 

    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 
+2

मैं इसे कम से कम प्रश्न के पाठ से जोड़ दूंगा, यह कहना मुश्किल है कि क्यों '__new__' या' __init__' चाल नहीं करता है। –