5

この記述子を定義するとします。

class MyDescriptor(object):

   def __get__(self, instance, owner):
        return self._value

    def __set__(self, instance, value):
        self._value = value

    def __delete__(self, instance):
        del(self._value)

そして私はこれでそれを使用します:

class MyClass1(object):
    value = MyDescriptor()


>>> m1 = MyClass1()
>>> m1.value = 1
>>> m2 = MyClass1()
>>> m2.value = 2
>>> m1.value
2

クラス属性valueも同様であり、すべてのインスタンスで共有されます。

これを定義すると:

class MyClass2(object)
    value = 1

>>> y1 = MyClass2()
>>> y1.value=1
>>> y2 = MyClass2()
>>> y2.value=2
>>> y1.value
1

この場合valueはインスタンス属性であり、インスタンスによって共有されません。

記述子である場合valueはクラス属性のみであるのにvalue、単純な整数である場合はインスタンス属性になるのはなぜですか?

4

2 に答える 2

11

instanceの実装でパラメータを無視していますMyDescriptor。そのため、クラス属性のように見えます。おそらくあなたはこのようなものが欲しいでしょう:

class MyDescriptor(object):

    def __get__(self, instance, owner):
        return instance._value

    def __set__(self, instance, value):
        instance._value = value

    def __delete__(self, instance):
        del(instance._value)
于 2011-05-10T03:22:59.153 に答える
0

以下のコードを試してみると機能しません:

class MyClass1(object):
    value = MyDescriptor()
    value2 = MyDescriptor()

c = MyClass1()
c.value = 'hello'
c.value2 = 'world'

# where c.value also equals to "world"
于 2012-09-12T01:14:14.467 に答える