2013-05-07 1 views
8

У меня есть класс следующим образом:Python: Как вызвать метод экземпляра из метода класса того же класса

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() throws TypeError: unbound method get_params() must be called with MyClass instance as first argument (got nothing instead)

Есть ли способ сделать так? Thanks

+4

Почему бы вам не сделать 'get_params' класс? – BrenBarn

+0

«MyClass» - пример, «get_params» представляет метод, который широко известен из других методов ** instance ** в моем классе, и я думаю, что должен быть какой-то способ вызвать его из класса, вместо того, чтобы изменять ВСЕ методы, которые в настоящее время называют это. Спасибо в любом случае :) – Gerard

+2

Что делает 'get_params'? Если это метод экземпляра, вам нужно будет иметь экземпляр для его вызова. Если вы этого не сделаете, это, вероятно, не должно быть методом экземпляра. Вы можете вызвать метод экземпляра из любой другой области, хотя, просто предоставив экземпляр класса как явный первый аргумент. –

ответ

5

Нет, вы не можете и не должны вызывать метод экземпляра из класса без экземпляра. Это было бы очень плохо. Вы можете, однако, вызвать метод класса из метода instance и instance. Варианты

  1. сделать get_param метод класса и исправить ссылки на него
  2. имеют __init__ вызов get_param, так как это метод экземпляра

Также вы можете быть заинтересованы в AttrDict, так как это выглядит что вы пытаетесь сделать.

+1

Примечание: данный выбор не помог решить мою проблему, но может быть полезен для кого-то другого. Принимая, потому что объяснение очень ясно, почему вы не можете сделать это :) – Gerard