Python中如何实现当调用的属性不存在时自动初始化并返回值?
我想要做到这样的效果:
- 从返回的 JSON 中读取作者信息,转化成 People 对象,此时的 People 对象只有 id 等基本属性,描述、粉丝数需要额外联网获取
- 当访问 People 的基本属性时,直接返回;当访问属性不存在时,进行联网初始化,之后返回值,期间要判断这个属性存不存在,因为有可能 People 压根就没有这个属性;
def __getattr__(self, v):
self.init()
try:
return self.__dict__[v]
except Exception as e:
pass
我这么写,一直错误
Python中如何实现当调用的属性不存在时自动初始化并返回值?
getattr(v, None)?
用 __getattr__ 魔法方法就行。当访问不存在的属性时,这个方法会被触发,你可以在里面实现初始化逻辑并返回。
class AutoInit:
def __init__(self):
self._data = {}
def __getattr__(self, name):
# 当属性不存在时,初始化一个空列表并赋值给该属性
if name not in self._data:
self._data[name] = []
return self._data[name]
# 可选:实现__setattr__来统一管理属性设置,避免与__getattr__循环调用
def __setattr__(self, name, value):
if name == '_data':
super().__setattr__(name, value)
else:
self._data[name] = value
# 使用示例
obj = AutoInit()
print(obj.users) # 第一次访问,自动初始化为空列表 []
obj.users.append('Alice')
print(obj.users) # 输出: ['Alice']
print(obj.products) # 第一次访问,自动初始化为空列表 []
简单说就是:用 __getattr__ 拦截未知属性访问,在里面完成初始化。
#1 啊?什么意思?我要的不是 None 啊
getattr(obj, v, defult)
obj: 对象
v: 属性名
defult: 默认值
hasattr()?
每次调用 hasattr,我的 getattr 魔术方法总会捕捉到错误…心累
我知道啊,可是我要的那个值需要联网获取啊。
我给你解释一下吧。
就是我开始拿到的是一个每个用户简要的信息,当要访问用户的高级的信息的时候,就联网初始化,返回值。
#5 是我学艺不精了…
本来就是取不到某个属性的时候才会调用__getattr__ 如果__getattr__被调用了, 而且对应的 key 是一个合法的 key 的话直接初始化高级数据就可以了
一楼已经解释得很清楚了。getattr 获取不到给定对象得指定属性时候就回返回 defualt 得值,这个值设为初始化函数调用就是联网获取数据了。如 getattr(a,‘no_exist_attribute’,requests.get(‘https://www.baidu.com’).content)
nice
#8 可是我的用户是这么写代码的:
for v in Question(‘5546455002’).answers():
print(v.content)
print(v.author.name)
这两个属性就是高级属性,而且获取完 author 之后,name 还是 author 的高级属性,必须重新获取
不过没事了,我最后自己解决了(笑哭
def getattr(self, v):
if self.is_init == False:
self.is_init = True
self.init()
return super().getattribute[v]
#8
#7
#3
#11 描述符是针对类的,我这里只是属性


