9

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

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

谢谢

4

4 回答 4

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
于 2013-01-18T20:37:46.150 回答
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)
于 2013-01-18T20:48:25.840 回答
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"
于 2013-01-18T20:39:36.717 回答
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()

希望能帮助到你

于 2013-01-18T20:46:00.847 回答