例如为什么在一些Python的内置功能,我们使用的变量,比如字符串
class c:
var = 15
getattr(c, 'var')
或
i = 0
globals()['i'] = 25
为什么在这里我们的变量的写作像字符串类型。 我在一些内置函数和Django中看到了这一点,我认为这会让代码很难理解是不是?
例如为什么在一些Python的内置功能,我们使用的变量,比如字符串
class c:
var = 15
getattr(c, 'var')
或
i = 0
globals()['i'] = 25
为什么在这里我们的变量的写作像字符串类型。 我在一些内置函数和Django中看到了这一点,我认为这会让代码很难理解是不是?
globals()
返回一个字典,所以你必须使用变量名作为字符串看着它。在globals()['var']
,'var'
只是在globals()
返回字典的关键,因此它必须作为字符串。
getattr(c, 'var')
寻找属性"var"
in c.__dict__
。
记住:Python的让我们类型的字典沉重。
如果知道变量名事先,他们是恒定的,那么你可以做不同的方式这两个东西:
getattr(c, 'var')
这是一个速记:
try:
return c.var
except AttributeError:
if have_default: # hand-wavey "more to this" for a later lesson
return default
raise
和
globals()['i'] = 25
是做
012讨厌的方式global i
i = 25
你给基本上达到进入内部,并与他们摆弄周围的方法。使用global
关键字来声明,你是在全球范围内使用的变量,因为当功能被解释Python知道该变量是在这一点上不同范围内更好的办法。
但是,如果你不知道该变量的名称预先,那么你会被迫做它在你的例子的方式。 (但请,请使用globals
一个之前三思而后行。在运行时把任意变量在模块的全局命名空间?* 不寒而栗 *)
嗯,是的,在这些具体的例子有肯定做一个简单的方法。但是'getattr'和'globals'有它的用处,如果你想要处理未知的属性/变量和/或动态地设置它们。 – deceze
你还想要一个变量的**名称**吗? –
这些方法有其用处,但是,通常使用动态变量会使代码更难理解 –