6

私はそのようなことはないと知っています。だからこそ、私はいくつかの素敵な同等物を探しています。このクラスを持つ:

class MyClass:
   a = 5
   b  = "foo"
   c = False

フィールド a と b を「グループ化」して、このグループのメンバーのみを何らかの方法で反復できるようにしたいと思います。したがって、次のようなフィールド デコレータがあると便利です。

class MyClass:
   @bar
   a = 5
   @bar
   b  = "foo"
   c = False

そして、('a', 'b') を返す myDir(MyClass, 'bar') のような関数を用意します。

これまでのところ、どのようなオプションがありますか? 1. 'a_bar'、'b_bar' などの特別な規則に従ってこれらのフィールドに名前を付けますが、残念ながらできません。2. 別のクラス メンバーとして名前のリストを作成します。このグループ化属性を属性の近くに保持したいので、このアプローチは好きではありません。3. 'a' と "foo" に 5 を割り当てる代わりに、整数と文字列から継承するクラスを作成し、'Group' などの別の基本クラスを追加して、型をチェックすることができます。この方法で、このクラスを生成する必要があります。新しいタイプがあるたびに、このソリューションも好きではありません。

他のアイデアはありますか?

4

2 に答える 2

8

デコレーターは関数呼び出しの構文糖衣にすぎないため、デコレーターを属性に適用するには、イニシャライザーで呼び出す必要があります。

a = bar(5)

あなたの場合、記述子プロトコルを実装するオブジェクトを作成できます。

class GroupedAttribute(object):
    def __init__(self, group, obj):
        self.group = group
        self.obj = obj
    def __get__(self, obj, owner):
        return self.obj
    def __set__(self, obj, value):
        self.obj = value

優雅さのために、属性グループのクラスを書くことができます:

class GroupedAttribute(object):
    def __init__(self, group, obj):
        self.group = group
        self.obj = obj
    def __get__(self, obj, owner):
        return self.obj
    def __set__(self, obj, value):
        self.obj = value

class AttributeGroup(object):
    def __call__(self, obj):
        return GroupedAttribute(self, obj)
    def __get__(self, obj, owner):
        return BoundAttributeGroup(self, obj, owner)

class BoundAttributeGroup(object):
    def __init__(self, group, obj, owner):
        self.group = group
        self.obj = obj
        self.owner = owner
    def __dir__(self):
        items = dir(self.owner if self.obj is None else self.obj)
        return [item for item in items if
                getattr(self.owner.__dict__.get(item, None),
                        'group', None) is self.group]

使用法:

class MyClass(object):
    bar = AttributeGroup()
    a = bar(5)
    b = bar("foo")
    c = False
dir(MyClass.bar)    # ['a', 'b']
于 2012-11-23T16:52:39.347 に答える
0

後で参照するために変数名を保持したい場合は、辞書を使用できます。したがって、オブジェクト内のこのコード...

self.dict_bar_props = {}

self.dict_bar_props["a"] = 5
self.dict_bar_props["b"] = "foo"
self.dict_bar_props["c"] = False

...後でオブジェクトのプロパティにアクセスすると、次の結果が得られます。

objectName = myObject()
objectName.dict_bar_props["a"]
>> 5

変数名を完全に分けておきたいが、定義された命名規則に基づいて後で見つけたい場合は、次のように、「bar_」で始まる変数名のみを返すハッキーなものを使用できます。

import re
varnames = dir(objectName)
list_of_property_names    = [ a for a in varnames if re.match("bar_", a) ]
于 2012-11-23T16:40:02.677 に答える