默认情况下使用class属性的奇数getattr()行为

时间:2018-06-17 11:47:23

标签: python python-3.x getattr

这里我预计所有4个ID都是相同的,但是当我将class属性传递给default的{​​{1}}属性时,它只是跳过属性查找并始终返回getattr

default

这是预期和/或记录的行为吗?为什么Python 3.6.5 (default, May 11 2018, 04:00:52) Type 'copyright', 'credits' or 'license' for more information IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: from datetime import datetime ...: ...: class my_cls(object): ...: @property ...: def _id(self): ...: self._cid = datetime.now().isoformat() ...: return self._cid ...: ...: def get_id(self): ...: return getattr(self, '_cid', self._id) ...: ...: cls = my_cls() ...: print('Init ID:', cls._id) ...: print('Still OK:', getattr(cls, '_cid', False)) ...: print('WRONG:', getattr(cls, '_cid', cls._id)) ...: print('WRONG:', cls.get_id()) ...: ...: Init ID: 2018-06-17T12:45:20.409601 Still OK: 2018-06-17T12:45:20.409601 WRONG: 2018-06-17T12:45:20.409804 WRONG: 2018-06-17T12:45:20.409849 正在做它正在做的事情?

1 个答案:

答案 0 :(得分:4)

不是getattr,而是在调用cls._id之前访问getattr的代码。

在Python中,在调用函数之前,会对其所有参数进行求值。特别是,在getattr(cls, '_cid', cls._id)子表达式中cls._id进行了评估。为此,访问_id属性,更新_cid。之后调用getattr并返回更新后的值。