redaiconglin 发表于 2022-4-1 19:13:49

关于046课描述符中的测试题第3题的疑问

小甲鱼老师的代码是这样
>>> 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
打印后的显示
test.x
<__main__.MyDes object at 0x0000000002CA21F0>
小甲鱼老师的讲解是访问实例层次上的描述符 x,只会返回描述符本身。为了让描述符能够正常工作,它们必须定义在类的层次上。如果你不这么做,那么 Python 无法自动为你调用 __get__ 和 __set__ 方法。
我是不是应该这样做能体现老师讲解的意思
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
这样打印后的结果就是9了。谢谢老师帮我看看

isdkz 发表于 2022-4-1 19:38:45

9 没有问题,__get__ 返回的就是 val 的平方

redaiconglin 发表于 2022-4-1 20:17:28

isdkz 发表于 2022-4-1 19:38
9 没有问题,__get__ 返回的就是 val 的平方

谢谢老师

阿奇_o 发表于 2022-4-1 20:23:39

本帖最后由 阿奇_o 于 2022-4-1 20:35 编辑

什么"类的层次上"? 其实关键就一句话:"要使用描述符 必须 实例化描述符,并 赋值给 一个类变量名" 。

ps: 难道这老师不说 "类变量"、"实例变量" 这些基本的OOP概念?

pps:

至于__get__, __set__ 那只是 描述符自己本身的定义。

做个比喻:
描述符 就好比是你和张三约定,你把某件东西(类变量)给他来保管(张三即描述符,你和他之间的约定,又叫"描述符协议")。
当你要用到这件东西时(调用),张三就根据你们之间定好的约定(相当于__get__所定义的规则),来获取和返回给你那个东西(或关于这个东西的一个统计结果)。


页: [1]
查看完整版本: 关于046课描述符中的测试题第3题的疑问