九歌当下 发表于 2023-9-23 21:01:02

为什么无法使用__gatattribute__方法拦截,属性访问

class C:
    def __init__(self, a):
      self.a = a
    def __gatattribute__(self, name):
      print("已经拦截")

      
c = C(5)
c.a
5

Mike_python小 发表于 2023-9-23 21:01:11

在您提供的代码中,存在一个拼写错误。正确的方法名应该是__getattr__而不是__gatattribute__。因此,无法使用__gatattribute__方法进行属性访问拦截。

请修改代码如下:


class C:
    def __init__(self, a):
      self.a = a
   
    def __getattr__(self, name):
      print("已经拦截")

c = C(5)
c.a


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-9-23 21:01:12

这是因为__gatattribute__方法的正确拼写是__getattr__ ,所以在你的代码中, __gatattribute__方法并没有被调用。如果你将方法名改为__getattr__ ,那么在访问C类的实例属性时,就会自动调用该方法,从而实现拦截和修改属性访问的功能。修改后的代码如下所示:

class C:
    def __init__(self, a):
      self.a = a
    def __getattr__(self, name):
      print("已经拦截")
      return getattr(self, name)

c = C(5)
c.a


输出结果为:

已经拦截
5

陶远航 发表于 2023-9-23 21:01:16

在你提供的代码中,你打算使用__getattr__方法来拦截属性访问。然而,你遇到了一个问题,就是无法成功拦截属性访问并打印出"已经拦截"。

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

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

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

c = C(5)
c.a# 这里会触发属性访问拦截


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

希望这样解决了你的问题。如果你还有其他疑问,请随时追问。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 为什么无法使用__gatattribute__方法拦截,属性访问