Muszę znaleźć elegancki sposób na zrobienie 2 rodzajów miksów.Co to są eleganckie sposoby na MixIns w Pythonie?
pierwsze:
class A(object):
def method1(self):
do_something()
Teraz, MixInClass
powinny method1
to zrobić: do_other()
->A.method1()
->do_smth_else()
- czyli w zasadzie "wrap" starszej funkcji. Jestem prawie pewien, że musi istnieć dobre rozwiązanie tego.
drugie:
class B(object):
def method1(self):
do_something()
do_more()
W tym przypadku, chcę MixInClass2
aby móc wprowadzić się między do_something()
i do_more()
, tj .: do_something()
->MixIn.method1
->do_more()
. Rozumiem, że to prawdopodobnie wymagałoby modyfikacji class B
- to jest w porządku, szukając najprostszych sposobów, aby to osiągnąć.
To są dość trywialne problemy i faktycznie je rozwiązałem, ale moje rozwiązanie jest skażone.
Najpierw użyj numeru self._old_method1 = self.method1(); self.method1() = self._new_method1();
i napisz _new_method1()
, który dzwoni pod numer _old_method1()
.
Problem: wiele składników MixIns zmieni nazwę na _old_method1 i jest nieelegancka.
Drugi miks W jednym rozwiązano, tworząc metodę atrapową call_mixin(self): pass
i wstrzykując ją między wywołaniami i definiując self.call_mixin()
. Ponownie nieelegancki i przerwie wiele MixIns ..
Wszelkie pomysły?
Dzięki Boldewyn, Znalazłem eleganckie rozwiązanie pierwsza (ja zapomniałem można utworzyć dekoratorów on-the-fly, bez modyfikowania oryginalnego kodu):
class MixIn_for_1(object):
def __init__(self):
self.method1 = self.wrap1(self.method1)
super(MixIn_for_1, self).__init__()
def wrap1(self, old):
def method1():
print "do_other()"
old()
print "do_smth_else()"
return method1
wciąż szukają na pomysły na drugie (ten pomysł nie pasuje, ponieważ muszę wstrzykiwać wewnątrz starej metody, a nie na zewnątrz, tak jak w tym przypadku).
Roztwór do sekundę poniżej, zastępując "pass_func" z lambda:0
.
Na drugie pytanie, czy mixin.method1 potrzebuje parametrów, a jeśli tak, to czy te parametry zależą od zmiennych/wartości zwracanych w do_something()? I wreszcie, czy do_more() potrzebuje wyniku twojego mixina? – KillianDS
Nie, do_more() nie wymaga wyniku. Argumenty? Prawdopodobnie potrzebuję tylko "ja", które i tak powinno zostać przekazane. –