0

インスタンスのインスタンス化後に取得されたインスタンス属性、またはインスタンスの構築中に設定されたインスタンス属性が、記述子を介して行われる理由がわかりません。

たとえば、次の記述子とクラスがあるとします。

ディスクリプタ

from weakref import WeakKeyDictionary

class Positive:

   def  __init__(self):
      self._instance_data = WeakKeyDictionary()

   def __get__(self, instance, owner):
      return self._instance_data[instance]

   def __set__(self, instance, value):
      if value <= 0:
         raise ValueError(f'Value {value} is not positive')
      self._instance_data[instance] = value

   def __delete__(self, instance):
      raise AttributeError('Cannot delete attribute!')

クラス

class Planet:

   def __init__(self, name, mass_kilograms):
      self.name = name
      self.mass_kilograms= mass_kilograms

   mass_kilograms = Positive()

次に、Planet のインスタンスを作成し、その質量を取得します。

pluto = Planet(name = 'Pluto', mass_kilograms = 1.305e22) 
# The above line is doing Positive.__set__(self, pluto, 1.305e22) under the hood.
# It is NOT doing self.mass_kilograms = 1.305e22. In fact, all of the instance
# attributes are stored in the descriptor Positive's _instance_data
m = pluto.mass_kilograms # m = Positive.__get__(self, pluto, Planet)

Positive.__get__それがクラス属性であることを考えると、なぜ呼び出されるのかわかりません。誰か説明してくれませんか?さらに紛らわしいのはPositive.__set__、コンストラクタ パラメータの直接割り当てをインターセプトする方法mass_kilogramsです。

ありがとう!

4

1 に答える 1