Python中函数指针的替代方案
我在低级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