#python #python_3x #инкапсуляция
Вот код: class mutant(): def __init__(self,a,b): self.a = a self.b = b def method_(self): print(f'i am good&print a={self.a}') def method_(self): print(f'i am MUTANT&print b={self.b}') z = mutant(3,500) z.method_() z.__dict__['method_'] = method_ z.method_() ясное дело не работает. можно ли как-то его сделать таким, чтобы на выходе было: i am good&print a=3 i am MUTANT&print b=500 Помнится где-то читал что в Python инкапсуляция "ненастоящая", а примера найти не могу. Сможем?
Ответы
Ответ 1
Отличие только в типе method vs function. Значит, проще всего обернуть: from types import MethodType ... z = mutant(3,500) method_ = MethodType(method_, z) z.method_() # i am good&print a=3 z.__dict__['method_'] = method_ z.method_() # i am MUTANT&print b=500Ответ 2
Важное примечание: ни один из способов (даже MethodType из соседнего ответа) не даст доступа к приватным атрибутам, начинающимся с двух подчёркиваний (self.__c). Нужно будет использовать что-то вроде self._mutant__c, как и в других аналогичных случаях. Вариант номер раз, без self (функции и так известен объект через переменную z): class mutant(): ... def method_(): print(f'i am MUTANT&print b={z.b}') z = mutant(3,500) z.method_() z.method_ = method_ z.method_() Вариант номер два, если очень хочется self: import functools class mutant(): ... def method_(self): print(f'i am MUTANT&print b={self.b}') z = mutant(3,500) z.method_() z.method_ = functools.partial(method_, z) z.method_() Вариант номер три, с изменением класса, а не экземпляра: class mutant(): ... def method_(self): print(f'i am MUTANT&print b={self.b}') z = mutant(3,500) z.method_() mutant.method_ = method_ z.method_() Вариант номер четыре — MethodType
Комментариев нет:
Отправить комментарий