python变量名解析机制?

时间:2014-01-09 07:01:30

标签: python variables

python如何解析变量名?在下面的例子中。 为什么不在ChildA中打印(Base)而不是引用基类? ChildA(Base)中的Base是引用Bass类还是字符串类或'String'?

class Base(object):
    def __init__(self):
        print( "Base created")

class ChildA(Base):
    def __init__(self):
        print(Base)
        Base.__init__(self)


Base = 'string'
ChildA()

2 个答案:

答案 0 :(得分:4)

在下面的句子中,

Base = 'string'

代码用字符串对象覆盖Base

>>> class Base(object):
...     def __init__(self):
...         print( "Base created")
...
>>> class ChildA(Base):
...     def __init__(self):
...         print(Base)
...         Base.__init__(self)
...
>>> Base
<class '__main__.Base'>
>>> Base = 'string' # <-------
>>> Base
'string'

答案 1 :(得分:4)

查找在代码执行时动态发生。当Python到达行print(Base)时,它会查找名为Base的局部变量,然后在名称为Base的封闭范围内向上和向上查找。在这种情况下,它在全局命名空间中找到一个,并且在您调用ChildA()时,该变量是一个字符串。

换句话说,函数中的free(即非局部)变量确实是自由的:它们所引用的内容在定义函数时并未“锁定”,而是每次函数都被重新查找被称为。

请注意class ChildA(Base)中的Base确实明确引用了示例中的Base类。那是因为类定义只执行一次,那时名称Base指向该类。