Python中函数指针的替代方案

9 投票
4 回答
14258 浏览
提问于 2025-04-17 13:15

我在低级C语言编程方面工作了很多年,但对面向对象的方法了解不多。在C语言中,如果我在开发分层架构,每一层都有通过函数指针定义的接口。这样做的好处是,只需在初始化时将这些函数指针设置为另一个层,就可以完全替换掉整个层。

我想在Python中实现同样的功能。这次我想知道最酷的实现方式是什么。为了让你了解我的问题背景,我有一个数据生成器,可以将记录输出到不同的媒介。这个媒介是在配置时指定的。我不想在这里使用if或switch语句。在C语言中,最好的方法是使用函数指针,但在Python中有哪些选择呢?任何面向对象的方法也很受欢迎。

谢谢

4 个回答

3

在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"
5

你可以把这些函数放在一个字典里

{"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)
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

撰写回答