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()
答案 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
指向该类。