私はpython記述子を理解しましたが、これについて少し混乱しています..
次のようなクラス記述子がある場合
class Descriptor(object):
def __get__(self, instance, owner):
print 'getting'
return self.value
def __set__(self, instance, value):
print 'setting'
self.value = value
def __delete__(self, instance):
print 'deleting'
del self.value
そして、管理したい属性を持つクラスは、このようなものです..
class Test(object):
name = Descriptor()
def __init__(self, name):
print 'init test'
self.name = name
クラス Test のオブジェクトを作成して何かを行うと、次のような答えが得られます...
t = Test('abc')
init test
setting
>>> t.name
getting
'abc'
>>> del t.name
deleting
>>> t
<__main__.Test object at 0x013FCCD0>
>>> t.name
getting
今、私はクラス Test1 をこのようなものにしたいと思っています..
class Test1(object):
def __init__(self, value):
print 'init test1'
self.name = Descriptor()
self. value = value
そして、Test1 のオブジェクトを作成し、Test1 のインスタンスの属性にアクセスしようとすると、次のような出力が得られます..
t1 = Test1(12)
t1.name
>>> getting
>>> 12
>>> t1.name = 30
>>> setting
Q 1) 私の質問は、この名前属性が Test1 の init で宣言されているか、Test1 のインスタンスにバインドされているかどうかです... t1 の属性辞書を取得しようとすると、空の辞書が返されるためです...
t1.__dict__
>>> {}
クラス Test のインスタンス t についても同じ
t.__dict__
>>> {}
これらのインスタンスのいずれかに新しい属性を追加すると、次のようになります...
t.some = 'some'
>>> t1.some = 'some'
再び属性ディクショナリにアクセスしようとすると、今追加したものだけが表示されます..すべてのインスタンス属性
t.__dict__
>>> {'some': 'some'}
>>> t1.__dict__
>>> {'some': 'some'}
Q 2) init で定義されたインスタンス属性 (クラス Descriptor と Test の変数名と値など) とインスタンス作成後に定義された属性 (変数 t.some など) の違いは何ですか。
Q 3) クラス Test はクラス Test1 とどう違うのですか?