我了解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
问1)我的问题是这个名称属性是否在Test1的init中声明,是否绑定到Test1的实例...因为当我尝试获取t1的属性字典时,它返回空dict ...
t1.__dict__
>>> {}
与类Test的实例t相同
t.__dict__
>>> {}
当我向这些实例中的任何一个添加新属性时,就像这样...
t.some = 'some'
>>> t1.some = 'some'
再一次,如果我尝试访问属性字典,它只会给我刚才添加的属性..现在所有实例属性
t.__dict__
>>> {'some': 'some'}
>>> t1.__dict__
>>> {'some': 'some'}
问题2)那么init中定义的实例属性(例如,类Descriptor和Test中的变量名称和值)与实例创建后定义的属性(例如变量t.some)之间有什么区别?
问3)类Test与类Test1有何不同。
相关分类