2015-09-18 4 views
1

Продолжая обсуждение с этого вопроса: Dynamically adding methods with or without metaclass, при выполнении динамического injetion, какова разница и преимущества/Вопр делать это в методе __new__ против метода __init__ ?методы Динамически добавляющие с метаклассом «__init__» против «__new__»

В указанном вопросе новый метод добавляется с помощью setattr. Если вы это сделаете в методе __new__, вам необходимо изменить параметр dict. Используя тот же самый пример, было бы что-то вроде этого:

class Meta(type) 
    def __new__(cls, clsname, bases, dct): 
     def my_method(self, x): 
      return x in self.letters 

     dct[my_method.__name__] = my_method 
     return super(Meta, cls).__new__(cls, clsname, bases, dct) 

ответ

2

Если вы сделаете это в новом методе, вам необходимо изменить параметр Dict

Ну, не обязательно, вы можете а также использовать setattrпосле вы создали новый объект класса, то есть:

class Meta(type) 
    def __new__(cls, clsname, bases, dct): 
     def my_method(self, x): 
      return x in self.letters 

     newclass = super(Meta, cls).__new__(cls, clsname, bases, dct) 
     setattr(newclass, my_method.__name__, my_method) 
     return newclass 

так в основном, в Meta.__init__ вы можете изменить только объект объекта, который уже был запущен, а в Meta.__new__ вы можете проверить и изменить родителей и пространство имен до, создав класс и после этого измените созданный класс.

Итак, в чем смысл использования __init__? Ну иногда вам не нужна вся мощь __new__ дает вам только желание изменить только что созданный класс, а затем __init__ сохранит вам дополнительный шаблон создания класса.

 Смежные вопросы

  • Нет связанных вопросов^_^