鱼C论坛

 找回密码
 立即注册
查看: 968|回复: 5

[已解决]为什么不报错呢?

[复制链接]
发表于 2024-7-30 23:23:58 | 显示全部楼层 |阅读模式

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

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

x
  1. >>> class C:
  2. ...     def __init__(self, name, age):
  3. ...         self.name = name
  4. ...         self.__age = age
  5. ...     def __getattribute__(self, attrname):
  6. ...         print("拿来吧你~")
  7. ...         return super().__getattribute__(attrname)
  8. ...     def __getattr__(self, attrname):
  9. ...         if attrname == "FishC":
  10. ...             print("I love FishC.")
  11. ...         else:
  12. ...             raise AttributeError(attrname)
  13. ...        
  14. >>> c = C("小甲鱼", 18)
  15. >>> c.FishC
  16. 拿来吧你~
  17. I love FishC.
复制代码


我认为运行 c.FishC 的时候,应该报错,对吗?
我认为由于FishC的属性不是C类的属性,所以运行的时候,先调用__getattribute__方法,然后在调用__getattr__
由于FishC属性不存在,所调用__getattribute__方法是,先输出’拿来吧你',然后应该报错才对,我的理解对吗?
最佳答案
2024-7-30 23:51:37
wbzxz 发表于 2024-07-30 23:51
如果你在 `__getattribute__` 中调用了 `super().__ge ...


是的,您理解得非常正确!让我们更清晰地梳理一下这个过程:

1. **调用 `__getattribute__`**:当你尝试访问一个属性时,首先会调用对象的 `__getattribute__` 方法。

2. **查找属性**:
   - 在 `__getattribute__` 方法中,如果你使用 `super().__getattribute__(attrname)` 来查找属性,并且该属性不存在,那么 Python 会抛出 `AttributeError`。
   - 抛出这个异常后,Python 不会直接终止程序,而是会查找是否有 `__getattr__` 方法来处理这个情况。

3. **调用 `__getattr__`**:
   - 如果你的类中定义了 `__getattr__` 方法,Python 将会调用它。
   - 在 `__getattr__` 中,你可以根据需要做一些自定义处理,比如返回特定的字符串或者其他对象。
   - 如果在 `__getattr__` 中处理完后没有抛出异常(例如,您返回了 "I love FishC."),那么就不会出现报错。

所以,您的总结是完全正确的!通过这种方式,您可以为一些不存在的属性提供备用机制,而不会导致程序运行时抛出错误。这是一种非常灵活的设计,让你能够控制对象对于未知属性的响应。

如果还有疑问或者想了解更多细节,随时欢迎提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-30 23:45:28 | 显示全部楼层
我想问一下,是不是碰到C类不存在的属性时,
先是调用   `__getattribute__` 方法, 然后调用__getattr__方法

但是 __getattribute__方法中的 super().__getattribute__方法,如果存在__getattr__方法时,是不会调用super().__getattribute__方法的,对吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 23:51:31 | 显示全部楼层
如果你在 `__getattribute__` 中调用了 `super().__getattribute__`,并且找不到该属性,那么它就会抛出 `AttributeError`,当抛出`AttributeError`时,这时候就会去调用__getattr__,根据__getattr__方法所写的代码执行,故不会出现报错问题。
我理解的对吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-11 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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