如果这个问题太愚蠢,那么我可以裸露,但我基本上来自c / c ++背景。
我有以下代码。
#!/usr/bin/python
import os
class Logger(object):
def __init__ (self):
print "Constructor of Logger "
def logMsg(self):
print "logMsg::"
class FileLogger (Logger):
def __init__ (self):
print "Constructor of File Logger"
def logMsg (self):
print "FileLogger::"
class FTPLogger (Logger):
def __init__ (self):
print "Constructor of FTP Logger"
def logMsg (self):
print "FTPLogger::"
def logMsg(log):
print "Logging Message"
logHandler.logMsg() # **HERE: HOW POSSIBLE TO ACCESS logHandler Variable?**
logHandler = FileLogger ();
logMsg(logHandler);
问题:
FileLogger类的logMsg()函数如何能够访问logHandler?。
我可以认为'logHandler'是一个全局变量吗?
答案 0 :(得分:2)
当你在任何函数之外定义logHandler变量时,该变量在模块中的范围内变成全局的(本质上是Python文件),你可以在像logMsg(log)这样的函数中看到它(并引用它)。 p>
但是,在您编写的代码的上下文中,在我看来,使用logHandler会出错,因为您将logHandler对象传递给logMsg函数。你的logMsg函数看起来应该是这样的,我想:
def logMsg(log):
print "Logging Message"
log.logMsg()
否则,当您将另一个对象传递给该函数时,它将尝试访问全局变量logHandler中的任何一个,而不是您在日志中传入的那个。
这个问题的答案提供了有关Python范围的更多细节:
答案 1 :(得分:1)
参见Naming and Binding参考资料;未在该函数中分配给('bound')的函数中的Python名称被视为自由变量。
如果变量在代码块中使用但未在其中定义,则它是自由变量。
在父作用域中查找自由变量,最终在全局范围内查找。
logHandler
函数永远不会分配logMsg()
名称,因此Python认为它是一个自由变量,并在全局命名空间中查找它。您的模块中存在一个名称的实际全局,因此代码可以正常工作,并且不会引发NameError
异常。
你还为函数提供了一个本地名称log
,它传递了logHandler
个对象;函数log
内部绑定到同一对象,因此您可以使用log.logMsg()
代替。