2

質問を説明するために、次のコードを確認してください。

class MyDescriptor(object):
  def __get__(self, obj, type=None):
    print "get", self, obj, type
    return self._v
  def __set__(self, obj, value):
    self._v = value
    print "set", self, obj, value
    return None

class SomeClass1(object):
  m = MyDescriptor()

class SomeClass2(object):
  def __init__(self):
    self.m = MyDescriptor()

x1 = SomeClass1()
x2 = SomeClass2()

x1.m = 1000
# ->  set <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> 10000
x2.m = 1000 # I guess that this overwrites the function. But why?
# ->
print x1.m
# -> get <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> <class '__main__.SomeClass1'> 10000
print x2.m
# -> 10000
  1. x2.m = 1000が__set__関数を呼び出さないのはなぜですか? これは関数を上書きしているようです。しかし、なぜ?
  2. x1 の_vはどこですか? x1._vにはありません
4

3 に答える 3

3

2番目の質問に答えるには、どこにあり_vますか?

記述子のバージョンは、_v記述子自体に保持されます。記述子の各インスタンス(クラスレベルのインスタンスSomeClass1、およびクラスのオブジェクト内のすべてのオブジェクトレベルのインスタンスは、のSomeClass2個別の値を持ちます_v

このバージョンを見てください。このバージョンは、記述子に関連付けられたオブジェクトを更新します。これは、オブジェクト(SomeClass1またはx2)に属性が含まれることを意味します_v

class MyDescriptor(object):
  def __get__(self, obj, type=None):
    print "get", self, obj, type
    return obj._v
  def __set__(self, obj, value):
    obj._v = value
    print "set", self, obj, value
于 2009-01-09T14:55:59.717 に答える
3

これこれを読む必要があります。

__set__SomeClassの関数と__get__MyDescriptorクラスの関数をオーバーロードしなかったため、関数が上書きされます。たぶん、SomeClassにMyDescriptorを継承させたいですか?SomeClass1は、静的メソッドAFAIKであるため、「get」および「set」出力を出力します。詳細については、上のリンクをお読みください。

于 2009-01-09T15:11:27.893 に答える
0

x1の_vを見つけました: SomeClass1.__dict__['m']._vにあります

他の回答内で S.Lott によって提案されたバージョンの場合: _vx1._vにあります

于 2009-01-10T18:17:28.203 に答える