2013-01-18 3 views
9

저수준 C 프로그래밍에서 수년간 일해 왔으며 객체 지향 접근법에 대한 충분한 노출이 없습니다. C에서 일부 계층화 된 아키텍처를 개발할 경우 각 계층에는 함수 포인터로 정의 된 인터페이스가 있습니다. 다른 레이어로 초기화 할 때 함수 포인터를 설정하면 전체 레이어를 대체 할 수 있다는 장점이 있습니다.파이썬에서 함수 포인터 대체

이번에도 Python에서 같은 것을 원합니다. 그것을 달성하는 가장 멋진 방법은 무엇입니까? 내 문제에 대한 약간의 배경을 제공하기 위해 다른 매체에 레코드를 출력 할 수있는 데이터 생성기가 있습니다. 매체는 구성시 지정됩니다. if 문을 여기에 사용하거나 스위치를 사용하고 싶지 않습니다. 가장 좋은 방법은 C에서 함수 포인터를 사용하는 것이지만 여기서는 파이썬에서 사용할 수있는 옵션은 무엇입니까? 모든 객체 지향 접근법도 환영합니다.

감사합니다.

+0

다형성 http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming을 살펴 –

답변

14

파이썬은 기능을 1 급 데이터 유형으로 지원합니다. 그래서 당신은 같은 것을 할 수 있습니다 : 파이썬은 확실히 더 정교한 객체 지향 프로그래밍 스타일을 지원하지만이 C에서 함수 포인터에 대한 사용자의 경험과 매우 유사

foo: one 
bar: ten 

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

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

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

인쇄, 당신은 아래에 있습니다 그들을 사용할 의무는 없습니다.

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() 

이 버전 인쇄 : 당신이 함께 기능을 그룹 관련 수있는 클래스, 사용

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

저주 다시 좌절! – argentage

+0

+1. "함수 포인터 테이블"C 이디엄 (OP가 시작될 것이라고 생각하는 곳)을 간단한 "함수"에 포팅 할 수있는 방법을 보여주는 예제를 추가하는 것이 가치가 있습니다. – abarnert

+0

고마워, 이건 멋지지만 ...이 목표를 달성하기 위해 다른 옵션이나 프로그래밍 스타일을 정교하게 할 수 있겠 니? –

2

파이썬 기능의 일류 데이터 유형입니다. 이 선하여 alog

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

"first class value"는 함수 포인터 이상을 의미합니다. 예를 들어 런타임에 새 함수를 만들 수 있습니다. – delnan

3

은 아마 뭔가 :

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() 

그것이라고

4

당신은 단순히 딕셔너리

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

default_function의 기능을 넣을 수 있습니다 희망이 도움이 경우의 없음 키 일치

당신은 당신이 선택을 분리 할 수 ​​있습니다 할 경우 호출

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

some_instance = SomeClass(selected_function)