鱼C论坛

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

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

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

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

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

x
4. 请问以下代码会打印什么内容?

  1. >>> class MyDes:
  2.         def __init__(self, value = None):
  3.                 self.val = value
  4.         def __get__(self, instance, owner):
  5.                 return self.val ** 2

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

  9. >>> test = Test()
  10. >>> test.x
复制代码


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

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

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

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

  6. class Test:
  7.     x = MyDes(3)

  8. test = Test()
  9. test.x
复制代码

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

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

定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

在def __init__()里的属性也是属性,为什么就不可以用描述符呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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




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

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 18:16:36 | 显示全部楼层
越来越高科技了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

非常感谢版主,每次都能来答疑解惑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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