Porównaj następujący kod w C++:Przechodząc "wskaźnik do funkcji wirtualnego" jako argument w Pythonie
#include <iostream>
#include <vector>
struct A
{
virtual void bar(void) { std::cout << "one" << std::endl; }
};
struct B : public A
{
virtual void bar(void) { std::cout << "two" << std::endl; }
};
void test(std::vector<A*> objs, void (A::*fun)())
{
for (auto o = objs.begin(); o != objs.end(); ++o)
{
A* obj = (*o);
(obj->*fun)();
}
}
int main()
{
std::vector<A*> objs = {new A(), new B()};
test(objs, &A::bar);
}
aw Python:
class A:
def bar(self):
print("one")
class B(A):
def bar(self):
print("two")
def test(objs, fun):
for o in objs:
fun(o)
objs = [A(), B()]
test(objs, A.bar)
Kod C++ wydrukuje:
one
two
natomiast Python kod wypisze
one
one
Jak mogę przekazać „wskaźnik do metody” i rozwiązać go zastąpionej jeden, osiągnięcie takiego samego zachowania w Pythonie jak w C++?
Aby dodać kontekst i wyjaśnić, dlaczego początkowo pomyślałem o tym wzorze. Mam drzewo składające się z węzłów, które mogą być podklasowane. Chciałbym utworzyć ogólną funkcję przemierzania wykresu, która pobiera węzeł wykresu, a także funkcję, która może być nadpisana w podklasach węzłów grafów. Funkcja oblicza pewną wartość dla węzła, biorąc pod uwagę wartości obliczone dla sąsiednich węzłów. Celem jest zwrócenie wartości obliczonej dla danego węzła (co wymaga przejścia całego wykresu).
czy za strukturyzacji kodu Pythona tak, że jesteś * nie * próbuje replikować w semantykę inny język? Czuję, że im bardziej Pythonic to robi, nie ma nic wspólnego z dziedziczeniem ani dynamiczną wysyłką. –
Zgadzam się, problem polega na tym, że nie mam lepszego wzoru na mój problem. Zobacz opis opisu problemu. Wolałbym rozwiązanie Pythoniczne. –
Wygląda na to, że chcesz uzyskać wzór gościa. –