- 论坛徽章:
- 0
|
本帖最后由 fengyizi 于 2011-01-02 20:42 编辑
主要是13章面向对象编程13.13以后就比较模糊了。讲的是用特殊方法定制类和新式类的高级特性。
1:
调用一个类or实例的属性,比如a.foo
原书说是:type(x).__dict__['foo'].__get__(x, type(x))
我的理解是:
是先查找a.__dict__ -> a的父类.__dict__ -> __getattribute__() -> __getattr()__ 然后调用 __get__
还有他说描述符就是__get__ 、__set__ 这些方法又说有优先级。什么类属性 > 数据属性 > 势力属性 > 非数据属性 > 默认为__getattr()__
那到底哪个有限,因为有个例子。把__get__ 、__set__都设为pass,就不能访问任何属性了,但用__dict['foo']__却能访问。
这里我就搞不懂了。
2.- class DevNull3(object):
- def __init__(self, name=None):
- self.name = name
- def __get__(self, obj, typ=None):
- print 'Accessing [%s]... ignoring' %
- self.name)
- def __set__(self, obj, val):
- print 'Assigning %r to [%s]... ignoring' %
- val, self.name)
复制代码 这个我根本无法编译通过,说__new__缺少参数。我是python2.5.4
3.- >>> class C3(object):
- ... foo = DevNull3('foo')
- ...
- >>> c3 = C3()
- >>> c3.foo = 'bar'
- Assigning 'bar' to [foo]... ignoring
- >>> x = c3.foo
- Accessing [foo]... ignoring
- >>> print 'c3.foo contains:', x
- c3.foo contains: None
- >>> print 'Let us try to sneak it into c3 instance...'
- Let us try to sneak it into c3 instance...
- >>> c3.__dict__['foo'] = 'bar'
- >>> x = c3.foo
- Accessing [foo]... ignoring
- >>> print 'c3.foo contains:', x
- c3.foo contains: None
- >>> print "c3.__dict__['foo'] contains: %r" % \
- c3.__dict__['foo'], "... why?!?"
- c3.__dict__['foo'] contains: 'bar' ... why?!?
复制代码 这个里面有个问题我在1里提到了。
还有个问题,看2的代码,是访问2的属性才会不能。
但为什么这里要新建个类C3来访问。
我觉得应该是c3.foo.xxx 这样才行,因为c3本身没有覆盖object的__get__ 和 __set__
这个小节的最后一句话:请注意,在示例中,我们并没有用到 obj 的实例。别把 obj 和 self 搞混淆,这个 self 是指描
述符的实例,而不是类的实例。 我想和我上面的问题有关,但是不懂。
希望明白的高手指点下,谢谢。
对了,描述符到底是什么?我觉得就是那些方法。但看文章感觉又不是那些方法。。。。。。 |
|