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 に答える