-3

xこの例では、 のインスタンスに触れずに のキーを探すことができますCか?

class C:
    def __init__(self):
        self.x = dict(one=1, two=2)

私の目的:

と がElementClassありManagerClassます。ElementClassdict で実装された構造体が含まれています。また、ManagerClassメソッドは、入力 dict のキーをプロトタイプ dict キーのキーと比較して、入力を検証する必要があります。

あいまいさなしにこれをどのように実装できますか?

UPD: で宣言すると、すでにインスタンスに触れていることを意味すると言われてxselfます。実際には常にではありません:

class C:
    x = dict(one=1, two=2)

    def m(self):
        print(id(self.x)

x = C()

この例では で宣言xしていませんselfが、 でアドレス指定できますself

4

2 に答える 2

3

現在の設定ではありません。ただし、xクラス変数を作成できます。

class C(object):
    x = dict(one=1, two=2)

クラス変数を利用して、クラス全体のインスタンスのリストを保持できます。

class C(object):
    instances = []

    def __init__(self):
        self.x = dict(one=1, two=2)

        self.instances.append(self)

Cこれで、クラス変数にアクセスして、のすべてのインスタンスを反復処理できます。

for instance in C.instances:
    print instance.x

これにクラス変数を使用することはお勧めできません。マネージャー クラスにリストを追加するだけです。

class Manager(object):
    def __init__(self):
        self.elements = []

    def is_valid(self, element):
        return 42 not in element.x

    def validate(self):
        for element in self.elements:
            if not self.is_valid(element):
                return False

        return True

class Element(object):
    def __init__(self, manager):
        manager.elements.append(self)

        self.x = {'one': 1, 'two': 2}

if __name__ == '__main__':
    manager = Manager()
    element1 = Element(manager)
    element2 = Element(manager)
    element3 = Element(manager)

    print manager.validate()
于 2012-12-25T21:34:50.977 に答える
1

インスタンス属性は、属性となるインスタンスがなければ存在しません。そのクラスのインスタンスからクラス属性にアクセスできますが、その場合、属性はインスタンスではなくクラス自体に属します。単純なデコレーターまたは記述子プロトコルを調べxて、中央のインターフェースを介してすべてのインスタンスのすべての値をカタログ化し、クラスがインスタンスとは異なる方法でデータにアクセスできるようにする構造を作成できます...

于 2012-12-25T21:47:55.480 に答える