鱼C论坛

 找回密码
 立即注册
查看: 1205|回复: 3

[已解决]关于046课描述符中的测试题第3题的疑问

[复制链接]
发表于 2022-4-1 19:13:49 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼老师的代码是这样
>>> 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了。谢谢老师帮我看看
最佳答案
2022-4-1 20:23:39
本帖最后由 阿奇_o 于 2022-4-1 20:35 编辑

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

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

pps:

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

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


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

使用道具 举报

发表于 2022-4-1 19:38:45 | 显示全部楼层
9 没有问题,__get__ 返回的就是 val 的平方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-1 20:17:28 | 显示全部楼层
isdkz 发表于 2022-4-1 19:38
9 没有问题,__get__ 返回的就是 val 的平方

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

使用道具 举报

发表于 2022-4-1 20:23:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-4-1 20:35 编辑

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

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

pps:

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

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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