一篇文章让你彻底明白__getattr__、__getattribute__、__g...

Python中的面向对象编程是一种非常重要的编程方式,而其中尤其重要的就是Python中的三个特殊方法:__getattr__、__getattribute__、__setattr__。这三个方法在Python语言中都有非常重要的作用,让我们来逐一了解它们吧。

__getattr__方法

当Python解释器在对象实例中找不到属性或方法时,就会自动调用实例的__getattr__方法,这个方法接受一个参数name,表示需要查找的属性名或方法名。如果实例中确实不存在这个属性或方法,那么__getattr__方法会被调用,接着你可以在这个方法中为实例添加新的属性或方法。

例如:

```python

class MyClass:

def __getattr__(self, name):

return "Accessing non-existent attribute '{}'".format(name)

my_instance = MyClass()

print(my_instance.some_attribute)

```

以上代码会打印出:"Accessing non-existent attribute 'some_attribute'",因为在实例中并不存在some_attribute这个属性。

__getattribute__方法

与__getattr__不同,__getattribute__是Python对象所有成员访问的第一道函数,当实例中访问对象时,该方法自动被调用。此时,如果要将实例所有属性和方法信息都返回,就需要将__getattribute__函数写出一遍,在函数内部使用super().__getattribute__(name)获取属性和方法。

例如:

```python

class MyClass:

def __init__(self, attr):

self.attr = attr

def __getattribute__(self, name):

print('Accessing attribute')

return super().__getattribute__(name)

my_instance = MyClass(42)

print(my_instance.attr)

```

以上代码会打印出:"Accessing attribute"和"42",因为在访问实例的属性attr时,实例中的__getattribute__方法被调用,打印出"Accessing attribute",然后将属性的值42返回。

__setattr__方法

与__getattribute__和__getattr__方法不同,__setattr__方法会在你对对象的任何属性或方法进行设置时被自动调用。这个方法的第一个参数是self,表示实例;第二个参数是name,表示需要设置的属性或方法名称;第三个参数是value,表示需要设置的属性或方法值。

例如:

```python

class MyClass:

def __setattr__(self, name, value):

print('Setting attribute')

super().__setattr__(name, value)

my_instance = MyClass()

my_instance.attr = 42

print(my_instance.attr)

```

以上代码会打印出:"Setting attribute"和"42",因为在设置实例的属性attr时,实例中的__setattr__方法被调用,打印出"Setting attribute",然后将属性的值42设置成功。

综上所述,__getattr__、__getattribute__、__setattr__都是Python中非常重要的特殊方法,它们能够让你控制实例成员的访问和设置,是Python面向对象编程中必不可少的部分。

接下来给出一些具体的例子来进一步说明这三个方法的用法:

例一:

```python

class MyClass:

def __init__(self, my_list):

self.my_list = my_list

def __getattr__(self, name):

if name == 'first':

return self.my_list[0]

else:

raise AttributeError

my_instance = MyClass([1, 2, 3])

print(my_instance.first) # 输出1

print(my_instance.second) # 抛出AttributeError异常

```

在这个例子中,我们在__getattr__方法中为实例添加了一个名为first的属性,用来返回my_list中的第一个元素。当实例中找不到属性时,也会自动调用该方法。

例二:

```python

class MyClass:

def __getattribute__(self, name):

print('Accessing attribute:', name)

return super().__getattribute__(name)

my_instance = MyClass()

my_instance.attr # 输出"Accessing attribute: attr"

```

在这个例子中,我们在__getattribute__方法中为实例添加了一个打印语句,每当实例中的成员被访问时就会自动调用该方法,打印出访问的属性或方法名。

例三:

```python

class MyClass:

def __setattr__(self, name, value):

print('Setting attribute:', name, '=', value)

super().__setattr__(name, value)

my_instance = MyClass()

my_instance.attr = 42 # 输出"Setting attribute: attr = 42"

```

在这个例子中,我们在__setattr__方法中为实例添加了一个打印语句,每当实例中的成员被设置时就会自动调用该方法,打印出设置的属性或方法名和值。

综上所述,__getattr__、__getattribute__、__setattr__方法都是Python面向对象编程中非常重要的特殊方法,可以让你控制实例的成员访问和设置。对于Python面向对象编程有一定的了解后,使用这些方法可以让你更好地控制实例的成员,使代码更加优雅和易于维护。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(11) 打赏

评论列表 共有 0 条评论

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