鱼C论坛

 找回密码
 立即注册
查看: 1667|回复: 6

[已解决]第46讲,描述符

[复制链接]
发表于 2021-6-27 16:49:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
4. 请问以下代码会打印什么内容?
>>> class MyDes:
        def __init__(self, value = None):
                self.val = value
        def __get__(self, instance, owner):
                return self.val ** 2

>>> class Test:
        def __init__(self):
                self.x = MyDes(3)

>>> test = Test()
>>> test.x

答:如果你认为小甲鱼考的是 3 de 平方 == 9,那你就 too young too simple了!这其实是一个“陷阱”,我们先来看下会打印什么:
>>> test.x
<__main__.MyDes object at 0x1058e6f60>
复制代码

如你所见,访问实例层次上的描述符 x,只会返回描述符本身。为了让描述符能够正常工作,它们必须定义在类的层次上。如果你不这么做,那么 Python 无法自动为你调用 __get__ 和 __set__ 方法。`

以上是小甲鱼的题和答案,标红的地方是我不理解的,为什么上面代码中x就是实例层次上的描述符

我知道能得出9来的正确代码是这样,但是不明白下面的代码中x怎么就是类的层次了?
class MyDes:
    def __init__(self, value = None):
        self.val = value
    def __get__(self, instance, owner):
        return self.val ** 2

class Test:
    x = MyDes(3)

test = Test()
test.x
最佳答案
2021-6-27 17:53:27
非凡 发表于 2021-6-27 17:37
为什么只有在定义在类层次的属性,才可以了呢?用描述符

在def __init__()里的属性也是属性,为什么就 ...

定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 17:00:49 | 显示全部楼层


定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-27 17:37:33 | 显示全部楼层
Twilight6 发表于 2021-6-27 17:00
定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层 ...

为什么只有在定义在类层次的属性,才可以了呢?用描述符

在def __init__()里的属性也是属性,为什么就不可以用描述符呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 17:53:27 | 显示全部楼层    本楼为最佳答案   
非凡 发表于 2021-6-27 17:37
为什么只有在定义在类层次的属性,才可以了呢?用描述符

在def __init__()里的属性也是属性,为什么就 ...

定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 18:07:42 | 显示全部楼层
非凡 发表于 2021-6-27 17:37
为什么只有在定义在类层次的属性,才可以了呢?用描述符

在def __init__()里的属性也是属性,为什么就 ...




__init__ 是类的魔法方法,内部空间属于类的实例空间

在类中定义的方法(函数)也是同理,在方法的空间也都属于实例空间

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 18:16:36 | 显示全部楼层
越来越高科技了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-27 23:11:04 | 显示全部楼层
Twilight6 发表于 2021-6-27 18:07
__init__ 是类的魔法方法,内部空间属于类的实例空间

在类中定义的方法(函数)也是同理,在方 ...

非常感谢版主,每次都能来答疑解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表