- __ getattr__(self, item)的使用场景
访问一个对象属性的时候,如果属性不存在,就会去执行__getattr__()方法,如果属性存在,就不会调用__getattr__()方法
import logging
class Person(object):
def __init__(self, name):
self.name = name
def __getattr__(self, item):
if item == "oldname":
logging.warning("oldname在下一个版本中将被废弃,请使用name。")
return self.name
else:
raise AttributeError(item + "属性不存在")
p1 = Person("Deng")
print(p1.name) # Deng 这个值来自__init__()方法
print(p1.oldname) # Deng 这个值来自__getattr__()方法
# WARNING:root:oldname在下一个版本中将被废弃,请使用name。
- __setattr__(self, key, value)魔术方法的使用场景:
如果当前属性不存在就创建当前属性并赋值,如果存在就会修改当前变量的值
不能在方法内部使用 self.XXX = XXX的赋值形式,会产生递归调用
应该使用__dict__这个魔术属性。
class Person(object):
def __init__(self, name):
self.name = name
is_adult = False
def __setattr__(self, key, value):
"""
:param key: 类属性名称
:param value: 类属性的值
:return: None
如果当前属性不存在就给当前属性赋值
不能在这里使用 self.XXX = XXX的赋值形式,会产生递归调用
应该使用__dict__这个魔术属性。
"""
if key == "age":
self.__dict__["age"] = value
self.__dict__["is_adult"] = True if value >= 18 else False
else:
self.__dict__[key] = value
p1 = Person("Deng")
p1.age = 18
print(p1.is_adult) # True
p1.gender = 1
print(p1.__dict__)
# {'name': 'Deng', 'age': 18, 'is_adult': True, 'gender': 1}
- __getattr__(self, item)的使用场景:
访问一个对象属性的时候,不论属性存在与否,都会去执行__getattribute__方法.所以,相对于__getattr__方法,会先执行__getattribute__方法。
查了半天视频和文字资料,没有一个将这两个方法分别的适用场景说清楚的。所以,暂时放着不去管吧。
import logging
class Person(object):
def __init__(self, name):
self.name = name
def __getattr__(self, item):
if item == "oldname":
logging.warning("oldname在下一个版本中将被废弃,请使用name。")
return self.name
else:
raise AttributeError(item + "属性不存在")
def __getattribute__(self, item):
return super(Person, self).__getattribute__(item)