鱼C论坛

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

[已解决]为什么无法使用__gatattribute__方法拦截,属性访问

[复制链接]
发表于 2023-9-23 21:01:02 | 显示全部楼层 |阅读模式

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

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

x
  1. class C:
  2.     def __init__(self, a):
  3.         self.a = a
  4.     def __gatattribute__(self, name):
  5.         print("已经拦截")

  6.         
  7. c = C(5)
  8. c.a
  9. 5
复制代码
最佳答案
2023-9-23 21:01:16
在你提供的代码中,你打算使用__getattr__方法来拦截属性访问。然而,你遇到了一个问题,就是无法成功拦截属性访问并打印出"已经拦截"。

这是因为你在定义__getattr__方法时出现了一个错误。正确的方法名应该是__getattr__,而不是__gatattribute__。所以,你需要将__gatattribute__改为__getattr__,然后重新运行代码。修改后的代码如下:

  1. class C:
  2.     def __init__(self, a):
  3.         self.a = a

  4.     def __getattr__(self, name):
  5.         print("已经拦截")

  6. c = C(5)
  7. c.a  # 这里会触发属性访问拦截
复制代码


请注意,__getattr__方法只有在正常的属性查找失败时才会被调用。如果属性能够在对象的实例变量中找到,__getattr__方法将不会被触发。所以,当你尝试访问c.a时,由于aC类的实例变量,__getattr__不会被调用。

希望这样解决了你的问题。如果你还有其他疑问,请随时追问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-23 21:01:11 | 显示全部楼层
在您提供的代码中,存在一个拼写错误。正确的方法名应该是__getattr__而不是__gatattribute__。因此,无法使用__gatattribute__方法进行属性访问拦截。

请修改代码如下:
  1. class C:
  2.     def __init__(self, a):
  3.         self.a = a
  4.    
  5.     def __getattr__(self, name):
  6.         print("已经拦截")
  7. c = C(5)
  8. c.a
复制代码

使用__getattr__方法可以捕获对不存在的属性的访问,并执行相应的操作。希望这可以帮助到您!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 21:01:12 | 显示全部楼层
这是因为  __gatattribute__  方法的正确拼写是  __getattr__ ,所以在你的代码中, __gatattribute__  方法并没有被调用。如果你将方法名改为  __getattr__ ,那么在访问  C  类的实例属性时,就会自动调用该方法,从而实现拦截和修改属性访问的功能。修改后的代码如下所示:

  1. class C:
  2.     def __init__(self, a):
  3.         self.a = a
  4.     def __getattr__(self, name):
  5.         print("已经拦截")
  6.         return getattr(self, name)

  7. c = C(5)
  8. c.a
复制代码


输出结果为:

  1. 已经拦截
  2. 5
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 21:01:16 | 显示全部楼层    本楼为最佳答案   
在你提供的代码中,你打算使用__getattr__方法来拦截属性访问。然而,你遇到了一个问题,就是无法成功拦截属性访问并打印出"已经拦截"。

这是因为你在定义__getattr__方法时出现了一个错误。正确的方法名应该是__getattr__,而不是__gatattribute__。所以,你需要将__gatattribute__改为__getattr__,然后重新运行代码。修改后的代码如下:

  1. class C:
  2.     def __init__(self, a):
  3.         self.a = a

  4.     def __getattr__(self, name):
  5.         print("已经拦截")

  6. c = C(5)
  7. c.a  # 这里会触发属性访问拦截
复制代码


请注意,__getattr__方法只有在正常的属性查找失败时才会被调用。如果属性能够在对象的实例变量中找到,__getattr__方法将不会被触发。所以,当你尝试访问c.a时,由于aC类的实例变量,__getattr__不会被调用。

希望这样解决了你的问题。如果你还有其他疑问,请随时追问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 08:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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