2011-05-31 9 views
12

कक्षा के लोड होने के बाद ही मैं वर्तमान और विरासत कक्षाओं से बाधाओं को विलय करना चाहता हूं (प्रति ऑब्जेक्ट नहीं!)।पायथन में कक्षाएं (उदाहरण नहीं) कैसे शुरू करें?

class Domain(Validatable): 

    constraints = {...} 

ऐसा करने के लिए मैं एक विधि _initialize_class_not_instance कि प्रत्येक वर्ग के लिए एक बार बुलाया जाना चाहिए परिभाषित:

class Validatable: 

    @classmethod 
    def _initialize_class_not_instance(cls): 
     # merge constraints from derived class and base classes 
     pass 

    __class__._initialize_class_not_instance() # doesn't work 
    # Validatable._merge_constraints() # doesn't work too 

समस्या यह है कि __class__ इस संदर्भ में मौजूद नहीं है और Validatable भी परिभाषित नहीं है। लेकिन मैं इससे बचना चाहता हूं कि मेरे एपीआई के उपयोगकर्ता को प्रारंभिक विधि को स्पष्ट रूप से कॉल करना होगा या अतिरिक्त कक्षा सजावट का उपयोग करना होगा।

कक्षाओं को आरंभ करने के बारे में कोई विचार?

+0

ध्यान दें कि कक्षा ** ** उदाहरण हैं, आमतौर पर वे 'प्रकार' के उदाहरण होते हैं, लेकिन @Ignacio ने इंगित किया है कि वे 'प्रकार' के कस्टम उप-वर्ग के उदाहरण हो सकते हैं। रिकॉर्ड के लिए – Duncan

उत्तर

1

मैं कक्षा सजावट के बिना और विरासत के बिना समाप्त हुआ। यह डेकोरेटर वर्तमान और विरासत में मिला कक्षाओं की कमी विलीन हो जाती है और __init__ विधि ओवरराइड करता है: के बाद से डेकोरेटर वर्ग (बाधाओं विलय और तरीकों डालने) और उदाहरणों को संशोधित करने के लिए किया

def validatable(cls): 

    # merge constraints from derived class and base classes here ... 

    original_init = cls.__init__ 
    def init_to_insert(self, *args, **keywords): 
     self.errors = {} 
     original_init(self, *args, **keywords) 
    cls.__init__ = init_to_insert 
    return cls 

यह, मेरे समाधान के लिए महत्वपूर्ण है।

16

मेटाक्लास का उपयोग करें।

class MetaClass(type): 
    def __init__(cls, name, bases, d): 
    type.__init__(cls, name, bases, d) 
    cls.foo = 42 

class MyClass(object): 
    __metaclass__ = MetaClass 

print MyClass.foo 
+8

, पायथन 3 में, यह 'माइक्लास (ऑब्जेक्ट, मेटाक्लास = मेटा क्लास) ' – ninjagecko

+0

आपको मेटा क्लास की आवश्यकता क्यों है? "MyClass" की परिभाषा के बाद क्यों न केवल "MyClass.foo = 42" कथन डालें? –

संबंधित मुद्दे