当调用的属性不存在时,初始化再返回值,在 Python 里面怎么写?

2018-08-06 18:42:28 +08:00
 Cheez

我想要做到这样的效果:

    def __getattr__(self, v):

        self.init()
        try:
            return self.__dict__[v]
        except Exception as e:
            pass

我这么写,一直错误

2554 次点击
所在节点    Python
12 条回复
luguhu
2018-08-06 18:48:46 +08:00
getattr(v, None)?
Cheez
2018-08-06 19:18:13 +08:00
@luguhu #1 啊?什么意思?我要的不是 None 啊
luguhu
2018-08-06 19:51:49 +08:00
getattr(obj, v, defult)
obj: 对象
v: 属性名
defult: 默认值
Trim21
2018-08-06 20:03:52 +08:00
hasattr()?
Cheez
2018-08-06 21:46:44 +08:00
@Trim21 每次调用 hasattr,我的 getattr 魔术方法总会捕捉到错误........心累
Cheez
2018-08-06 21:47:57 +08:00
@luguhu 我知道啊,可是我要的那个值需要联网获取啊。

我给你解释一下吧。

就是我开始拿到的是一个每个用户简要的信息,当要访问用户的高级的信息的时候,就联网初始化,返回值。
Trim21
2018-08-06 22:06:36 +08:00
@Cheez #5 是我学艺不精了...
本来就是取不到某个属性的时候才会调用__getattr__ 如果__getattr__被调用了, 而且对应的 key 是一个合法的 key 的话直接初始化高级数据就可以了
BingoXuan
2018-08-06 22:08:24 +08:00
@Cheez
一楼已经解释得很清楚了。getattr 获取不到给定对象得指定属性时候就回返回 defualt 得值,这个值设为初始化函数调用就是联网获取数据了。如 getattr(a,'no_exist_attribute',requests.get('https://www.baidu.com').content)

@luguhu
nice
Cheez
2018-08-06 23:54:50 +08:00
@BingoXuan #8 可是我的用户是这么写代码的:

for v in Question('5546455002').answers():
print(v.content)
print(v.author.name)

这两个属性就是高级属性,而且获取完 author 之后,name 还是 author 的高级属性,必须重新获取
Cheez
2018-08-06 23:56:17 +08:00
不过没事了,我最后自己解决了(笑哭

def __getattr__(self, v):
if self.is_init == False:
self.is_init = True
self.init()
return super().__getattribute__[v]


@BingoXuan #8
@Trim21 #7
@luguhu #3
WilliamYang
2018-08-07 00:38:26 +08:00
感觉你用描述符更好
Cheez
2018-08-07 09:08:22 +08:00
@WilliamYang #11 描述符是针对类的,我这里只是属性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/477377

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX