4

次のようなpythonクラス(実際にはGoogle App Engineモデル)があります:

class MyClass(ParentClass):
    variable_one = PropertyClass(...)
    variable_two = PropertyClass(...)

異なる時点でのエンティティの 2 つのバージョンを表す、このクラスの 2 つのインスタンスの違いを記述できるシステムを構築するつもりです。最終的には次のような文字列が生成されます

"Variable One changed from 'foo' to 'bar', Variable Two changed from empty to 'baz'"

そのため、「variable_one」が「Variable One」として表示されるという事実をどこかに保存する必要があります。C# のバックグラウンドを持つ私の本能は、次のように属性を使用することです。

class MyClass : ParentClass
{
    [DisplayName("Variable One")]
    public PropertyClass variable_one;

    [DisplayName("Variable Two")]
    public PropertyClass variable_two;
}

最初は、python に相当するものはデコレータのように見えます。

class MyClass(ParentClass):
    @display_name("Variable One")
    variable_one = PropertyClass(...)

    @display_name("Variable Two")
    variable_two = PropertyClass(...)

ただし、デコレータは実際には関数のカリー化を行っており、クラス変数の定義は PropertyClass のインスタンスを variable_one と variable_two に割り当てているだけなので、有効な Python とは思えません。いずれにせよ、私はそれをどのように書くべきかわかりません。

1つのオプションは、PropertyClassを拡張することです...

class MyClass(ParentClass):
    variable_one = MyPropertyClass("Variable One", ...)
    variable_two = MyPropertyClass("Variable Two", ...)

しかし、いくつかの異なるプロパティ クラスが使用されており、それらすべてに 1 つの共通の動作を追加したいので、これは手間がかかりすぎるように思えます。

辞書を定義できると思います:

class MyClass(ParentClass):
    variable_one = PropertyClass(...)
    variable_two = PropertyClass(...)
    variable_display_names = {
        "variable_one": "Variable One",
        "variable_two": "Variable Two"
    }

しかし、これを達成するための最もPython的な方法について、経験豊富なpythonersから聞いてみたいと思っています。

4

1 に答える 1

4

データストア プロパティ クラスは記述子 (python@propertyデコレータのような) ですが、実装しないカスタム クラスとして__setattr__、これらのオブジェクトに任意の属性を設定できます。

 class MyClass(ParentClass):
     variable_one = PropertyClass(...)
     variable_one.display_name = "Variable One"

     variable_two = PropertyClass(...)
     variable_two.display_name = "Variable Two"

これは、次のデコレータに一般化できます。

def display_name(dispname):
    def decorate_with_display_name(prop):
        prop.display_name = dispname
        return prop
    return decorate_with_display_name

(インスタンスではなく) クラスを介してプロパティにアクセスする限り、これらの値を再度取得できます。たとえば、実行できるインスタンスが与えられますprint type(instance).variable_two.display_name

于 2013-01-30T12:51:08.833 に答える