鱼C论坛

 找回密码
 立即注册
查看: 1269|回复: 14

[已解决]属性访问的重写问题 小甲鱼代码中疑惑

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

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

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

x
本帖最后由 minamikotori 于 2022-5-1 19:36 编辑

小甲鱼的代码中,重写了父类的魔法方法
例如说若 不重写这几个魔法方法,那不应该是继承了基类的这些魔法方法(就是相当于没有print的环节)
那为什么不能直接在外面创建没有的属性

而是只有在 加上return 基类的魔法方法,这时才可以在外面随意创建属性

小甲鱼的代码中重写不就是仅仅加上了一句print吗 和直接继承后调用有什么区别呢
最佳答案
2022-5-1 19:31:47
你不重写的话,确实默认是继承了基类(object类)的方法,

而小甲鱼的代码中也是调用了基类的方法,所以小甲鱼这里是为了给你演示怎么重写魔法方法,

那个 print 是为了更清楚的看到 魔法方法 在什么时候被调用,

你不重写的话也可以添加属性,但是你如果重写的话就必须得调用基类的方法,

因为设置属性这些是底层写好了的,你只能添加自己额外的逻辑,

设置属性还是得靠基类的方法
QQ图片20220501191610.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-1 19:28:50 | 显示全部楼层

回帖奖励 +60 鱼币

是的,虽然看起来也可以,但小甲鱼这里是教你如何自己定义想要的方法,直接继承就没有这个效果 —— print(),
所以这还是有挺大区别的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
minamikotori + 5 + 5 + 3 无条件支持楼主!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-5-1 19:30:32 | 显示全部楼层
python爱好者. 发表于 2022-5-1 19:28
是的,虽然看起来也可以,但小甲鱼这里是教你如何自己定义想要的方法,直接继承就没有这个效果 —— print( ...

但是直接继承我并不能去访问C.x
会返回x属性不存在啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:31:47 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +60 鱼币

你不重写的话,确实默认是继承了基类(object类)的方法,

而小甲鱼的代码中也是调用了基类的方法,所以小甲鱼这里是为了给你演示怎么重写魔法方法,

那个 print 是为了更清楚的看到 魔法方法 在什么时候被调用,

你不重写的话也可以添加属性,但是你如果重写的话就必须得调用基类的方法,

因为设置属性这些是底层写好了的,你只能添加自己额外的逻辑,

设置属性还是得靠基类的方法

评分

参与人数 2荣誉 +5 鱼币 +5 贡献 +6 收起 理由
minamikotori + 5 + 5 + 3
python爱好者. + 3 没错^_^

查看全部评分

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

使用道具 举报

发表于 2022-5-1 19:31:54 | 显示全部楼层
minamikotori 发表于 2022-5-1 19:30
但是直接继承我并不能去访问C.x
会返回x属性不存在啊

所以自己写 当获取这个类中属性 的代码时,就能控制报错,更有个性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 19:34:35 | 显示全部楼层
isdkz 发表于 2022-5-1 19:31
你不重写的话,确实默认是继承了基类(object类)的方法,

而小甲鱼的代码中也是调用了基类的方法,所以 ...

对 我明白小甲鱼的意思
我的疑惑是 不去定义x 而可以访问(设置)属性x是基类的方法给的么
如果是的话,我不去重写,那基类的方法是不是也允许我不去定义x而访问(设置)属性x
然而 实际上返回给我x属性不存在了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 19:35:34 | 显示全部楼层
python爱好者. 发表于 2022-5-1 19:31
所以自己写 当获取这个类中属性 的代码时,就能控制报错,更有个性

嗯 但是自己写的话 以小甲鱼的案例  只是在基类的方法前加了个print 那为什么可以控制报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:36:06 | 显示全部楼层

回帖奖励 +60 鱼币

minamikotori 发表于 2022-5-1 19:30
但是直接继承我并不能去访问C.x
会返回x属性不存在啊

你得创建了这个属性才可以访问呀,

小甲鱼的代码之所以没有报错是因为 __getattr__ 中没有调用基类的 __getattr__,

所以实际上并没有访问属性,

你在 print("getattr") 的下面加上一句 super().__getattr__(name) 就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:36:25 | 显示全部楼层

回帖奖励 +60 鱼币

minamikotori 发表于 2022-5-1 19:34
对 我明白小甲鱼的意思
我的疑惑是 不去定义x 而可以访问(设置)属性x是基类的方法给的么
如果是的话 ...

基类的定义是:
当此属性没有被定义且被访问或修改就给出报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:37:12 | 显示全部楼层
我什么时候运气变这么好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 19:38:07 | 显示全部楼层
让我理一理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:38:15 | 显示全部楼层
isdkz 发表于 2022-5-1 19:37
我什么时候运气变这么好了

乐于助人的"报应"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 19:38:37 | 显示全部楼层
isdkz 发表于 2022-5-1 19:37
我什么时候运气变这么好了

哈哈 概率被我偷偷改成100了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 19:39:16 | 显示全部楼层
isdkz 发表于 2022-5-1 19:37
我什么时候运气变这么好了

哈哈 概率被我偷偷改成100%了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-1 19:39:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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