我在低级C编程工作多年,我没有足够的面向对象方法。在C中,如果我正在开发一些分层架构,那么每个层都有由函数指针定义的接口。通过在初始化时将这些函数指针设置为另一层,可以替换整个层的优点。
我想要同样的东西,但这次是在Python中。实现这一目标的最酷方式是什么?为了给我的问题提供一点背景知识,我有一个数据生成器,可以将记录输出到不同的介质。介质在配置时指定。我不想在这里使用if或switch语句。最好的方法是在C中使用函数指针,但Python中可用的选项有哪些。任何面向对象的方法也受到赞赏。
由于
答案 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)
是一流的数据类型。
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"