2

Pythonを知っている人が使うフレームワークを書いています。私はいくつかの構文に落ち着きました、そして私と彼らがこのようなものを使うことは理にかなっています、ここでBaseはフレームワークを実装するBaseクラスです。

class A(Base):
    @decorator1
    @decorator2
    @decorator3
    def f(self):
        pass

    @decorator4
    def f(self):
        pass

    @decorator5
    def g(self)
        pass

私のフレームワークはすべて、Baseのメタクラスを介して実装されています。これらのユーザー定義クラスはすべて豊富な継承グラフを持っているため、このセットアップは私のユースケースに適しています。ユーザーがいくつかのメソッドを実装するか、そのままにしておくことを期待していますpass。ユーザーがここで提供する情報の多くは、デコレーターにあります。これにより、ユーザーがモンキーパッチを適用したり、構造化されていない辞書を提供したりする必要がある他のソリューションを回避できます。

ここでの私の問題は、f(正当な理由で)ユーザーによって2回定義されていることであり、これは私のフレームワークによって処理される必要があります。残念ながら、これがメタクラスの__new__メソッドに到達するまでに、属性のディクショナリには1つのキーしか含まれていませんf@duplicate私のアイデアは、ユーザーがこれが起こっていることを通知するなど、さらに別のデコレータを使用することでした。また、2つfは互いに上書きされないように、異なる方法でラップされます。このようなものは機能しますか?

4

3 に答える 3

1

異なる を区別するには、名前空間を使用する必要がありますf

「Zen of Python」のアドバイスに注意してください。

名前空間は素晴らしいアイデアの 1 つです。もっと多くのことをしましょう!

于 2012-10-26T20:54:18.970 に答える
1

はい、できますが、醜いハックと、関数を新しい名前で保存することによってのみ可能です。

sys._getframe()関数を使用して、呼び出しフレームのローカル名前空間を取得する必要があります。そのローカル名前空間は構築中のクラスであり、その名前空間に項目を追加すると、メタクラスに渡されるクラス ディクショナリに項目が追加されることになります。

以下は、その名前空間を取得します。

callframe = sys._getframe(1)
namespace = callframe.f_locals

namespaceのように、辞書のようなオブジェクトlocals()です。その名前空間に何かを格納して (同様__function_definitions__のもの)、関数への追加の参照を追加できるようになりました。

于 2012-10-26T20:54:46.003 に答える
0

Java - メソッドのオーバーロードと引数の署名 - を考えているかもしれませんが、これは Python であり、これを行うことはできません。2 番目の f() は最初の f() をオーバーライドし、1 つの f() だけになります。名前空間は辞書であり、キーを重複させることはできません。

于 2012-10-26T20:54:51.600 に答える