五个与Python属性相关的魔术方法
2021-08-27 本文已影响0人
罗罗攀
前言
今天要给大家介绍五个魔术方法,他们都与Python属性相关,涉及获取、删除和修改属性,我们一起来看看吧。
__getattribute__方法
我们先来定义一个简单的类,访问属性没问题。
class User:
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
print(u1.name)
li
接着我们加入__getattribute__方法后,访问属性就会交给该方法处理。
class User:
def __getattribute__(self, item):
return 6
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
print(u1.name)
6
更加神奇的是,不管这个属性存不存在,都会返回6。
class User:
def __getattribute__(self, item):
return 6
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
print(u1.test)
6
- 触发时间:在访问对象成员属性的时候触发,无论是否存在。
- 作用:对属性进行一些处理。
- 参数:self为当前对象,item是访问属性名称的字符串。
- 返回值:属性值。
这里需要注意的是返回值千万不能用self.name,这样会无限递归下去,我们可以使用object的__getattribute__方法来访问。
class User:
def __getattribute__(self, item):
return object.__getattribute__(self, item)
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
print(u1.name)
li
__getattr__方法
- 触发时间:在访问不存在的对象属性的时候触发。
- 作用:访问不存在的属性时候,不会报错。
- 参数:self为当前对象,item是访问属性名称的字符串。
- 返回值:属性值。
我们举个简单例子,就是用户可能会输出属性名称,那我们都统一返回name属性。
class User:
def __getattr__(self, item):
return self.name
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
print(u1.na2me)
li
__setattr__方法
- 触发时间:添加和修改对象属性的时候触发。
- 作用:限制添加和修改对象属性的操作。
- 参数:self为当前对象,key为设置对象属性名称, value为设置的值。
- 返回值:无。
例如,我们让用户可以改name,不能改sex。
class User:
sex = 'male'
def __setattr__(self, key, value):
if key == 'sex':
pass
else:
object.__setattr__(self, key, value)
def __init__(self, name):
self.name = name
u1 = User('li')
u1.name = 'test'
u1.sex = 'female'
print(u1.name, u1.sex)
test male
__delattr__方法
- 触发时间:删除对象属性的时候触发。
- 作用:限制添加和修改对象属性的操作。
- 参数:self为当前对象,item为删除对象属性名称。
- 返回值:无。
我们可以让用户删除sex,但是不能删除name。
class User:
def __delattr__(self, item):
if item == 'sex':
pass
else:
object.__delattr__(self, item)
def __init__(self, name, sex):
self.name = name
self.sex = sex
u1 = User('li', 'male')
del u1.sex
print(u1.sex)
del u1.name
print(u1.name)
male
AttributeError: 'User' object has no attribute 'name'
__dir__方法
该方法返回类或者对象的所有成员名称列表,用的不是很多。
属性访问顺序
最后,我把属性访问的顺序列给大家,供大家参考学习。
- __getattribute__
- 数据描述符
- 当前对象的属性
- 类的属性
- 非数据描述符
- 父类的属性
- __getattr__
今天的分享就到这了,我们下期再见~