替换python中的函数指针

时间:2013-01-18 20:35:31

标签: python

我在低级C编程工作多年,我没有足够的面向对象方法。在C中,如果我正在开发一些分层架构,那么每个层都有由函数指针定义的接口。通过在初始化时将这些函数指针设置为另一层,可以替换整个层的优点。

我想要同样的东西,但这次是在Python中。实现这一目标的最酷方式是什么?为了给我的问题提供一点背景知识,我有一个数据生成器,可以将记录输出到不同的介质。介质在配置时指定。我不想在这里使用if或switch语句。最好的方法是在C中使用函数指针,但Python中可用的选项有哪些。任何面向对象的方法也受到赞赏。

由于

4 个答案:

答案 0 :(得分:16)

Python支持函数作为第一类数据类型。所以你可以这样做:

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

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

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

打印

foo: one
bar: ten

这与您在C中使用函数指针的经验非常相似。虽然Python当然支持更精细的面向对象编程风格,但您没有义务使用它们。

使用类的示例,您可以将相关功能组合在一起:

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 :(得分: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)

答案 2 :(得分: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()

希望有所帮助

答案 3 :(得分:2)

python函数中的

是一流的数据类型。

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"