+ -
当前位置:首页 → 问答吧 → python核心编程书中看不懂的一些问题求教

python核心编程书中看不懂的一些问题求教

时间:2011-01-02

来源:互联网

本帖最后由 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.
  1. class DevNull3(object):
  2.     def __init__(self, name=None):
  3.         self.name = name
  4.     def __get__(self, obj, typ=None):
  5.         print 'Accessing [%s]... ignoring' %
  6.       self.name)
  7.     def __set__(self, obj, val):
  8.         print 'Assigning %r to [%s]... ignoring' %
  9.             val, self.name)
复制代码
这个我根本无法编译通过,说__new__缺少参数。我是python2.5.4
3.
  1. >>> class C3(object):
  2. ...     foo = DevNull3('foo')
  3. ...
  4. >>> c3 = C3()
  5. >>> c3.foo = 'bar'
  6. Assigning 'bar' to [foo]... ignoring
  7. >>> x = c3.foo
  8. Accessing [foo]... ignoring
  9. >>> print 'c3.foo contains:', x  
  10. c3.foo contains: None
  11. >>> print 'Let us try to sneak it into c3 instance...'  
  12. Let us try to sneak it into c3 instance...
  13. >>> c3.__dict__['foo'] = 'bar'
  14. >>> x = c3.foo
  15. Accessing [foo]... ignoring
  16. >>> print 'c3.foo contains:', x  
  17. c3.foo contains: None
  18. >>> print "c3.__dict__['foo'] contains: %r" % \
  19. c3.__dict__['foo'], "... why?!?"
  20. c3.__dict__['foo'] contains: 'bar' ... why?!?
复制代码
这个里面有个问题我在1里提到了。
还有个问题,看2的代码,是访问2的属性才会不能。
但为什么这里要新建个类C3来访问。
我觉得应该是c3.foo.xxx 这样才行,因为c3本身没有覆盖object的__get__ 和 __set__

这个小节的最后一句话:请注意,在示例中,我们并没有用到 obj 的实例。别把 obj 和 self 搞混淆,这个 self 是指描
述符的实例,而不是类的实例。  我想和我上面的问题有关,但是不懂。
希望明白的高手指点下,谢谢。

对了,描述符到底是什么?我觉得就是那些方法。但看文章感觉又不是那些方法。。。。。。

作者: fengyizi   发布时间: 2011-01-02

我现在觉得真没法理解了:
  1. class DevNull1(object):
  2. def __get__(self, obj, typ=None):
  3. pass
  4. def __set__(self, obj, val):
  5. pass

  6.   我们建立一个类,这个类使用了这个描述符,给它赋值并显示其值:

  7. >>> class C1(object):
  8. ...     foo = DevNull1()
  9. >>> c1 = C1()
  10. >>> c1.foo = 'bar'
  11. >>> print 'c1.foo contains:', c1.foo  
  12. c1.foo contains: None
复制代码
怎么会是在C1里访问foo去隐藏呢。
应该是c1.foo.x 这样
因为是DevNull1覆盖了set和get啊。c1什么也没做啊,访问它的foo属性,怎么就不能呢?

作者: fengyizi   发布时间: 2011-01-02