免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2323 | 回复: 1
打印 上一主题 下一主题

python核心编程书中看不懂的一些问题求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-02 20:41 |只看该作者 |倒序浏览
本帖最后由 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 是指描
述符的实例,而不是类的实例。  我想和我上面的问题有关,但是不懂。
希望明白的高手指点下,谢谢。

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

论坛徽章:
0
2 [报告]
发表于 2011-01-02 20:51 |只看该作者
我现在觉得真没法理解了:
  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属性,怎么就不能呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP