一篇文章让你彻底明白__getattr__、__getattribute__、__g...,[原创]NIOS小知识总结

Python作为一门动态语言,具有很强的灵活性,可以在运行时动态地修改对象的属性和方法。在这个过程中,我们经常会遇到一些“神奇”的函数,如__getattr__、__getattribute__和__setattr__等等。接下来,本文将分别从三个方面深入解析这些函数,以帮助读者更好地掌握它们的用法和作用。

1. __getattr__

__getattr__是Python中的一个特殊方法,用于在访问一个不存在的属性时触发。如果某个对象没有该属性,那么Python解释器就会查看该对象是否定义了__getattr__方法,如果定义了该方法,就会调用__getattr__方法进行处理。下面是一个示例:

```

class A:

def __init__(self):

self.x = 10

def __getattr__(self, item):

print(f"{item}不存在!")

```

在这个例子中,我们定义了一个类A,其中有一个属性x等于10。接下来,当我们尝试访问一个不存在的属性时,如下所示:

```

a = A()

print(a.y)

```

输出结果就是“y不存在!”。这就是__getattr__方法起作用的例子。

需要注意的是,如果一个对象在定义了__getattr__方法的情况下,还定义了与该属性同名的属性,那么在访问该属性时,不会触发__getattr__方法,而是直接返回该属性的值。例如:

```

class A:

def __init__(self):

self.x = 10

def __getattr__(self, item):

print(f"{item}不存在!")

return None

a = A()

a.x = 20

print(a.x) # 输出20,不会触发__getattr__

print(a.y) # 输出“y不存在!”

```

2. __getattribute__

__getattribute__方法与__getattr__方法很相似,但是它会被每次属性访问触发,而不是在访问不存在的属性时触发。如果一个对象定义了__getattribute__方法,那么每次访问该对象的属性时,都会执行__getattribute__方法进行处理。下面是一个示例:

```

class A:

def __init__(self):

self.x = 10

def __getattribute__(self, item):

print(f"正在访问属性{item}")

return super().__getattribute__(item)

a = A()

print(a.x) # 输出“正在访问属性x”和“10”

```

在这个例子中,我们定义了类A,其中包含一个属性x等于10。在访问属性x时,__getattribute__方法就会被触发,输出“正在访问属性x”,并返回该属性的值。需要注意的是,在__getattribute__方法中,我们使用了super().__getattribute__(item)来获取属性的值,因为直接返回self.item会导致无限递归调用__getattribute__方法而造成死循环。

需要注意的是,__getattribute__方法并不是所有情况下都是必要的,大多数情况下我们使用默认的属性访问方法就可以了。而且,使用__getattribute__方法需要非常小心,因为其中可能会存在一些难以察觉的副作用。

3. __setattr__

__setattr__方法与__getattr__方法和__getattribute__方法类似,但是它是在设置属性值时触发。当某个对象的属性被设置时,Python解释器会首先查看该对象是否定义了__setattr__方法,如果定义了,则通过__setattr__方法进行处理。下面是一个示例:

```

class A:

def __init__(self):

self._x = 0

def __setattr__(self, name, value):

print(f"正在设置属性{name}为{value}")

super().__setattr__(name, value)

a = A()

a.x = 10 # 输出“正在设置属性x为10”

```

在这个例子中,我们定义了一个类A,其中包含一个属性_x等于0。当我们设置该对象的属性x时,Python解释器就会调用__setattr__方法进行处理,输出“正在设置属性x为10”,并将其值设为10。

需要注意的是,在__setattr__方法中使用super().__setattr__(name, value)来设置属性值是必须的,因为直接调用self.name = value会导致无限递归调用__setattr__方法导致死循环。

总结:

__getattr__、__getattribute__、__setattr__是Python中非常重要的方法,它们分别用于在访问不存在的属性、每次访问属性、设置属性值时进行处理。但是,使用这些方法需要非常小心,以避免出现难以察觉的副作用。

实际应用中,我们通常不需要使用这些方法,而是使用默认的属性访问方法即可。只有在特定的场景下,例如通过继承、混合等方式实现某些特定的属性访问行为时,才需要使用它们。

如果你喜欢我们阿吉时码(www.ajishima.com.cn)的文章, 欢迎您分享或收藏分享网文章 欢迎您到我们的网站逛逛喔!SLG资源分享网
友情提示:抵制不良游戏,拒绝盗版游戏。 注意自我保护,谨防受骗上当。 适度游戏益脑,沉迷游戏伤身。 合理安排时间,享受健康生活。适龄提示:适合18岁以上使用!
点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部