2

Pythonでdictデータを扱うコードに取り組んでいます。このようなクラスを実装する際には、多くのプロパティを定義する必要があります。そんなに難しくないのですが、ヘルパー関数みたいなものが使えたらもっといいなと最近思いました。

たとえば、次のようなクラスがあるとします。

class MyClass(object):

    def __init__(self, data):
        self.data = data

    @property
    def version(self):
        return self.data["version"]

このクラスを次のように書くことができれば。

 class MyClass(object):

     def __init__(self, data):
         self.data = data

     define_own_property("data", "version")

些細なことに見えますが、それができれば、多くの検証/例外処理ケースを再利用できると思います。

何か案が?:D

4

2 に答える 2

3

必要なアクセサーを返す関数を記述するだけで、そのようなことを実現できます。

def define_own_property(attr, key):
    def prop(self):
        return getattr(self, attr)[key]
    return property(prop)

class MyClass(object):
    def __init__(self, data):
        self.data = data

    version = define_own_property("data", "version")

しなければならないことに注意してくださいversion = ... 。単純な関数呼び出しdefine_own_propertyで、定義されているクラスにプロパティを追加する方法はありません。そのクラスはまだ存在しないため、参照できないためです。

もう1つの可能性は、クラスにリストまたは辞書、または関連するパラメーター(「データ」、「バージョン」など)を含む属性を与えてから、これらのパラメーターを読み取り、一連のプロパティ。これにより、クラス内でプロパティを定義する必要がまったくなくなります。プロパティにアクセスさせたいもののリストを指定し、クラスで一度デコレータを使用するだけです。

于 2012-11-29T05:31:39.293 に答える
2

記述子を使用できるようです:

class Descr(object):
    def __init__(self,attr,key):
        self.attr = attr
        self.key = key

    def __get__(self,obj,type=None):
        return getattr(obj,self.attr)[self.key]

    def __set__(self,obj,value):
        getattr(obj,self.attr)[self.key] = value

    def __delete__(self,obj):
        del getattr(obj,self.attr)[self.key]

class MyClass(object):
    def __init__(self, data):
        self.data = data

    version = Descr("data","version")
    foobar = Descr("data","foobar")

a = MyClass({})
a.version = 1
print a.version
a.foobar = 'string'
print a.data
于 2012-11-29T05:30:22.727 に答える