2013-05-07 8 views
8

के एक वर्ग विधि से एक उदाहरण विधि कॉल करने मैं एक वर्ग है इस प्रकार है:पायथन: कैसे एक ही कक्षा

class MyClass(object): 
    int = None 
    def __init__(self, *args, **kwargs): 
     for k, v in kwargs.iteritems(): 
      setattr(self, k, v) 

    def get_params(self): 
     return {'int': random.randint(0, 10)} 

    @classmethod 
    def new(cls): 
     params = cls.get_params() 
     return cls(**params) 

और मैं ऐसा करने में सक्षम होना चाहते हैं:

>>> obj = MyClass.new() 
>>> obj.int # must be defined 
9 

मेरा मतलब है MyClass का नया उदाहरण बनाये बिना, लेकिन जाहिर है कि यह आसान नहीं है, क्योंकि MyClass.new()TypeError: unbound method get_params() must be called with MyClass instance as first argument (got nothing instead)

क्या ऐसा करने का कोई तरीका है? धन्यवाद

+4

आप 'get_params' को क्लासमेथ भी क्यों नहीं बनाते? – BrenBarn

+0

'MyClass' एक उदाहरण है,' get_params' एक विधि का प्रतिनिधित्व करता है जिसे व्यापक रूप से मेरी कक्षा में अन्य ** उदाहरण ** विधियों से बुलाया जाता है, और मुझे लगता है कि इसे सभी को बदलने के बजाए कक्षा के तरीके से कॉल करने का कोई तरीका होना चाहिए वे विधियां जो वर्तमान में इसे कॉल करती हैं। वैसे भी धन्यवाद :) – Gerard

+2

'get_params' क्या करता है? यदि यह एक उदाहरण विधि है, तो आपको इसे कॉल करने के लिए एक उदाहरण होना चाहिए। यदि आप नहीं करते हैं, तो शायद यह एक उदाहरण विधि नहीं होनी चाहिए। आप किसी भी अन्य दायरे से एक इंस्टेंस विधि को कॉल कर सकते हैं, हालांकि, कक्षा को एक स्पष्ट प्रथम तर्क के रूप में प्रदान करके। –

उत्तर

5

नहीं, आप बिना किसी उदाहरण के कक्षा से एक इंस्टेंस विधि को कॉल नहीं कर सकते हैं और नहीं करना चाहिए। यह बहुत खराब होगा। हालांकि, आप क्लास विधि से और उदाहरण विधि को कॉल कर सकते हैं। विकल्प,

  1. get_param एक वर्ग विधि बनाने के लिए और यह करने के लिए
  2. __init__ है कॉल get_param संदर्भ को ठीक कर रहे हैं क्योंकि यह एक उदाहरण विधि

इसके अलावा, आप एक AttrDict में रुचि हो सकती है क्योंकि कि जैसा दिखता है आप क्या करने की कोशिश कर रहे हैं।

+1

नोट: दिए गए विकल्पों ने मेरी समस्या का समाधान नहीं किया है लेकिन किसी और के लिए उपयोगी हो सकता है। स्वीकार कर रहा है क्योंकि स्पष्टीकरण बहुत स्पष्ट है कि आप ऐसा क्यों नहीं कर सकते :) – Gerard

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