3

Pythonを使用して、クラスにプロパティを作成したいのですが、その名前を文字列にしています。通常、次のようにします。

blah = property(get_blah, set_blah, del_blah, "bleh blih")

get_、set_、および del_blah は適宜定義されています。次のように、変数のプロパティの名前で同じことを試みました。

setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))

しかし、それはうまくいきません。最初のケースではプロパティの値が返され、2 番目のケースではプロパティ、つまり が返されます<property object at 0xbb1aa0>。機能するように定義するにはどうすればよいですか?

4

3 に答える 3

2

私が言うように、違いは、最初のバージョンではclasses属性をプロパティの結果に変更し、2番目のバージョンではそれをインスタンスに設定することです(これは異なります!)。

このバージョンはどうですか:

setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

これを行うこともできます:

setattr(type(self), "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))
于 2009-07-31T13:38:45.570 に答える
1

1 つの方法は、locals() に書き込むことです。

class X:
    for attr in ["a","b","c"]:
        def getter(self, name=attr):
            return name+"_value"
        locals()[attr] = property(getter, None, None, attr)

x = X()
print x.a
print x.b
print x.c

与える

a_value
b_value
c_value
于 2009-07-31T13:30:55.980 に答える
1

あなたが何をしようとしているのか理解できれば、クラスのgetattr およびsetattrメソッドをオーバーライドすることでそれを達成できます。

例えば:

class Something(object):
    def __getattr__(self, name):
        # The name of the property retrieved is a string called name
        return "You're getting %s" % name

something = Something()

print something.foo
print something.bar

印刷します:

You're getting foo
You're getting bar

このようにして、文字列内のプロパティの名前を持ち、それに応じて何かを行う汎用ゲッターとセッターを持つことができます。

于 2009-07-31T13:33:37.820 に答える