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.
复制代码
这个我根本无法编译通过,说__new__缺少参数。我是python2.5.4
3.
复制代码
这个里面有个问题我在1里提到了。
还有个问题,看2的代码,是访问2的属性才会不能。
但为什么这里要新建个类C3来访问。
我觉得应该是c3.foo.xxx 这样才行,因为c3本身没有覆盖object的__get__ 和 __set__
这个小节的最后一句话:请注意,在示例中,我们并没有用到 obj 的实例。别把 obj 和 self 搞混淆,这个 self 是指描
述符的实例,而不是类的实例。 我想和我上面的问题有关,但是不懂。
希望明白的高手指点下,谢谢。
对了,描述符到底是什么?我觉得就是那些方法。但看文章感觉又不是那些方法。。。。。。
主要是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)
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?!?
还有个问题,看2的代码,是访问2的属性才会不能。
但为什么这里要新建个类C3来访问。
我觉得应该是c3.foo.xxx 这样才行,因为c3本身没有覆盖object的__get__ 和 __set__
这个小节的最后一句话:请注意,在示例中,我们并没有用到 obj 的实例。别把 obj 和 self 搞混淆,这个 self 是指描
述符的实例,而不是类的实例。 我想和我上面的问题有关,但是不懂。
希望明白的高手指点下,谢谢。
对了,描述符到底是什么?我觉得就是那些方法。但看文章感觉又不是那些方法。。。。。。
作者: fengyizi 发布时间: 2011-01-02
我现在觉得真没法理解了:
复制代码
怎么会是在C1里访问foo去隐藏呢。
应该是c1.foo.x 这样
因为是DevNull1覆盖了set和get啊。c1什么也没做啊,访问它的foo属性,怎么就不能呢?
- class DevNull1(object):
- def __get__(self, obj, typ=None):
- pass
- def __set__(self, obj, val):
- pass
-
- 我们建立一个类,这个类使用了这个描述符,给它赋值并显示其值:
-
- >>> class C1(object):
- ... foo = DevNull1()
- >>> c1 = C1()
- >>> c1.foo = 'bar'
- >>> print 'c1.foo contains:', c1.foo
- c1.foo contains: None
应该是c1.foo.x 这样
因为是DevNull1覆盖了set和get啊。c1什么也没做啊,访问它的foo属性,怎么就不能呢?
作者: fengyizi 发布时间: 2011-01-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28