今天要给大家介绍五个魔术方法,他们都与Python属性相关,涉及获取、删除和修改属性,我们一起来看看吧。
我们先来定义一个简单的类,访问属性没问题。
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.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
我们举个简单例子,就是用户可能会输出属性名称,那我们都统一返回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
例如,我们让用户可以改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
我们可以让用户删除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'
该方法返回类或者对象的所有成员名称列表,用的不是很多。
最后,我把属性访问的顺序列给大家,供大家参考学习。
今天的分享就到这了,我们下期再见~