非凡 发表于 2021-6-27 16:49:20

第46讲,描述符

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

Twilight6 发表于 2021-6-27 17:00:49



定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层次

非凡 发表于 2021-6-27 17:37:33

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

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

在def __init__()里的属性也是属性,为什么就不可以用描述符呢?

sunrise085 发表于 2021-6-27 17:53:27

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

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

定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法)

Twilight6 发表于 2021-6-27 18:07:42

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

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




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

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

nahongyan1997 发表于 2021-6-27 18:16:36

越来越高科技了

非凡 发表于 2021-6-27 23:11:04

Twilight6 发表于 2021-6-27 18:07
__init__ 是类的魔法方法,内部空间属于类的实例空间

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

非常感谢版主,每次都能来答疑解惑{:7_123:}
页: [1]
查看完整版本: 第46讲,描述符