2013-05-07 19 views
8

Ho una classe come segue:Python: Come chiamare un metodo di istanza da un metodo di classe della stessa classe

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) 

e vorrei essere in grado di fare:

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

Voglio dire senza creare una nuova istanza di MyClass, ma ovviamente non è così semplice, perché chiamare MyClass.new() genera TypeError: unbound method get_params() must be called with MyClass instance as first argument (got nothing instead)

C'è un modo per farlo? Grazie

+4

Perché non si rende 'get_params' un metodo di classe anche? – BrenBarn

+0

'MyClass' è un esempio,' get_params' rappresenta un metodo ampiamente chiamato da altri metodi ** instance ** nella mia classe, e penso che ci dovrebbe essere un modo per chiamarlo da un metodo class invece di cambiare TUTTO il metodi che attualmente lo chiamano. Grazie comunque :) – Gerard

+2

Cosa fa 'get_params'? Se si tratta di un metodo di istanza, è necessario disporre di un'istanza per chiamarlo. Se non lo fai, probabilmente non dovrebbe essere un metodo di istanza. È possibile chiamare un metodo di istanza da qualsiasi altro ambito, semplicemente fornendo un'istanza della classe come primo argomento esplicito. –

risposta

5

No, non è possibile e non si deve chiamare un metodo di istanza da una classe senza un'istanza. Questo sarebbe molto male. Puoi, tuttavia, chiamare un metodo di classe e un metodo di istanza. Le opzioni sono

  1. fare get_param un metodo di classe e fissare i riferimenti ad esso
  2. avere __init__ chiamata get_param, dal momento che si tratta di un metodo di istanza

Inoltre si può essere interessati a un AttrDict dal che sembra cosa stai cercando di fare.

+1

Nota: le scelte fornite non risolvono il problema MY ma potrebbero essere utili per qualcun altro. Accettazione perché la spiegazione è molto chiara del perché NON puoi farlo :) – Gerard

Problemi correlati