2013-01-18 22 views
9

Pracowałem w programowaniu C na niskim poziomie przez lata i nie mam wystarczającej ekspozycji na podejścia zorientowane obiektowo. W C, gdy tworzyłem architekturę warstwową, każda warstwa ma interfejsy zdefiniowane przez wskaźniki funkcji. Zaletą tego, że cała warstwa może być zastąpiona przez samo ustawienie tych wskaźników funkcji podczas inicjalizacji na inną warstwę.substytut wskaźników funkcji w python

Chcę tego samego, ale tym razem w Pythonie. Jaki jest najfajniejszy sposób, aby to osiągnąć. Aby dać małe tło mojemu problemowi, mam generator danych, który może wyprowadzać rekordy do różnych mediów. Medium jest określone w czasie konfiguracji. Nie chcę używać tutaj lub przełączać instrukcje tutaj. Najlepszym sposobem było użycie wskaźników funkcji w C, ale jakie są opcje dostępne tutaj w Pythonie. Dowolne podejście zorientowane na obiekt jest również doceniane.

Dzięki

+0

przyjrzeć polimorfizmu http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming –

Odpowiedz

14

Python obsługuje funkcje jako pierwszorzędne typy danych. Więc można zrobić coś takiego:

def foo(x): 
    print("foo: " + x) 

def bar(x): 
    print("bar: " + x) 

f = foo 
f("one") 
f = bar 
f("ten") 

wydruków

foo: one 
bar: ten 

ten jest bardzo podobny do swojego doświadczenia ze wskaźników funkcji w C. Chociaż Python z pewnością bardziej wyszukane obsługuje stylów programowania obiektowego, jesteś pod brak obowiązku korzystania z nich.

Przykładem pomocą klas, w których można grupa funkcji związanych ze sobą:

class Dog: 
    def noise(self, x): 
     print("bark! " + x) 
    def sleep(self): 
     print("sleeping on floor") 

class Cat: 
    def noise(self, x): 
     print("meow! " + x) 
    def sleep(self): 
     print("sleeping on keyboard") 

a = Dog() 
a.noise("hungry") 
a.sleep() 

a = Cat() 
a.noise("hungry") 
a.sleep() 

Ta wersja drukuje:

bark! hungry 
sleeping on floor 
meow! hungry 
sleeping on keyboard 
+1

przekleństw foliowane ponownie! – argentage

+0

+1. Warto dodać przykład pokazujący, jak łatwo można przenieść "tabelę wskaźników funkcyjnych" idiomem C (czyli tam, gdzie myślę, że OP będzie działać) do prostego "dyktowania" funkcji. – abarnert

+0

Dzięki, wygląda ładnie ... ale możesz opracować inne opcje lub style programowania, aby osiągnąć ten cel. –

2

w funkcji Pythona typy danych są pierwszej klasy.

def z(a): 
    print(a) 
def x(a): 
    print "hi" 

functions = [z,x] 
y = functions[0] 
y("ok") # prints "ok" 
y = functions[1] 
y("ok") # prints "hi" 
+1

Należy zauważyć, że "wartość pierwszej klasy" oznacza znacznie więcej niż wskaźniki funkcji: Na przykład nowe funkcje mogą być tworzone w czasie wykonywania. – delnan

3

Może coś AZaloguj tej linii:

class MediumA: 
    def one_method(self): 
     return 

    def another_method(self): 
     return 

class MediumB: 
    def one_method(self): 
     return 

    def another_method(self): 
     return 


class DataGenerator: 
    # here you can read this from some configuration 
    medium = MediumA() # this will be shared between all instances of DataGenerator 

    def generate(self): 
     # all mediums responds to this methods 
     medium.one_method() 
     medium.another_method() 

generator = DataGenerator() 
# you can even change the medium here 
generator.medium = MediumB() 

Nadzieja pomaga

4

można po prostu umieścić funkcje w dict

{"type1": function1, 
"type2": function2, 
"type3": function3, 
}.get(config_option, defaultfunction)(parameters, go, here) 

default_function nazywa jeśli żaden z klucze odpowiadają

Jeśli chcesz, możesz wydzielić wybór wywołujący

selected_function = {"type1": function1, 
        "type2": function2, 
        "type3": function3, 
        }.get(config_option, defaultfunction) 

some_instance = SomeClass(selected_function) 
Powiązane problemy