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/
发表评论 取消回复